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

时间:2013-02-27 11:42:34

标签: python numpy multidimensional-array

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

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

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

4 个答案:

答案 0 :(得分:8)

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

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

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

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

答案 1 :(得分:7)

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

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

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

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

答案 2 :(得分:5)

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)

答案 3 :(得分:1)

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

参考:用于数据分析的Python:使用Pandas,NumPy和IPython处理数据