我构建了一个类,对未来的数据进行了一些迭代。数据采用数组形式,不使用numpy对象。在我的代码中,我经常使用.append
来创建另一个数组。在某些时候,我将一个大数组1000x2000更改为numpy.array。现在我在出错后出错了。我开始将所有数组转换为ndarray,但.append
之类的注释不再起作用。我开始遇到指向行,列或单元格的问题。并且必须重建所有代码。
我尝试谷歌回答这个问题:“使用ndarray超过正常数组的优点和优势”我找不到明智的答案。你能写什么时候我应该开始使用ndarrays吗?如果你在练习中你同时使用它们或只坚持一个。
很抱歉,如果问题是新手级别,但我是python的新手,请尝试从Matlab迁移并想了解什么是利弊。感谢
答案 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数组,并期望您的代码继续工作。方法不同,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处理数据