繁体   English   中英

是什么原因使用ndarray而不是python数组

[英]what is a reason to use ndarray instead of python array

我构建了一个类,对未来的数据进行了一些迭代。 数据采用数组形式,不使用numpy对象。 在我的代码中,我经常使用.append来创建另一个数组。 在某些时候,我将一个大数组1000x2000更改为numpy.array。 现在我在出错后出错了。 我开始将所有数组转换为ndarray,但像.append这样的注释不再起作用了。 我开始遇到指向行,列或单元格的问题。 并且必须重建所有代码。

我试着回答一个问题的答案:“使用ndarray超过正常数组的优点和优势”我找不到合理的答案。 你能写什么时候我应该开始使用ndarrays吗?如果在你的练习中你使用它们或只坚持一个。

很抱歉,如果问题是新手级别,但我是python的新手,只是尝试从Matlab移动并想了解什么是利弊。 谢谢

NumPy和Python数组共享高效存储在内存中的属性。

NumPy数组可以加在一起,乘以一个数字,你可以在一个函数调用中计算所有值的正弦值,等等。正如HYRY指出的那样,它们也可以有多个维度。 你不能用Python数组做到这一点。

另一方面,Python数组确实可以附加到。 请注意,NumPy数组可以连接在一起( hstack()vstack() ,...)。 也就是说,NumPy数组主要是为了拥有固定数量的元素。

通常首先迭代地构建一个列表(或Python数组),然后将其转换为NumPy数组(使用numpy.array() ,或者更有效地使用numpy.frombuffer() ,如HYRY所提到的):这允许非常方便地执行对数组(或矩阵)的数学运算(复杂运算的简单语法)。 或者,可以使用numpy.fromiter()从迭代器构造数组。 或者loadtxt()从文本文件构造它。

使用NumPy阵列至少有两个主要原因:

  • NumPy数组比Python列表需要更少的空间。 因此,您可以在NumPy数组(内存中)处理比使用Python列表更多的数据。
  • NumPy数组拥有庞大的Python列表或Python数组不可用的函数和方法库。

是的,您不能简单地将列表转换为NumPy数组,并期望您的代码继续工作。 方法不同,bool语义不同。 为了获得最佳性能,即使是算法也可能需要更改。

但是,如果您正在寻找Matlab的Python替代品,您肯定会找到NumPy的用途。 值得学习。

array.array可以动态更改大小。 如果要从某些源收集数据,最好使用array.array 但是array.array只是一个维度,并且没有与它有关的计算函数。 因此,当您想对数据进行一些计算时,将其转换为numpy.ndarray ,并使用numpy中的函数。

numpy.frombuffer可以创建一个numpy.ndarray与共享相同的数据缓冲array.array对象,它的速度快,因为它不需要复制数据。

这是一个演示:

import numpy as np
import array
import random

a = array.array("d")
# a for loop that collects 10 channels data
for x in range(100):
    a.extend([random.random() for _ in xrange(10)])

# create a ndarray that share the same data buffer with array a, and reshape it to 2D
na = np.frombuffer(a, dtype=float).reshape(-1, 10)

# call some numpy function to do the calculation
np.sum(na, axis=0)

使用NumPy数组而不是内置列表的另一个巨大优势是NumPy有一个C API,允许本机C和C ++代码直接访问NumPy数组。 因此,许多用C语言等低级语言编写的Python库希望您使用NumPy数组而不是Python列表。

参考:用于数据分析的Python:与Pandas,NumPy和IPython进行数据争夺

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM