我构建了一个类,对即将到来的数据进行了一些迭代。数据以数组形式存在,不使用numpy对象。在我的代码中,我经常使用.append
来创建另一个数组。在某个时候,我将其中一个大数组1000x2000更改为numpy.array。现在我有一个又一个错误。我开始将所有数组转换为narray,但像.append
这样的注释不再工作了。我开始有指向行,列或单元格的问题。并且必须重新构建所有的代码。
我试着谷歌一个问题的答案:"什么是和使用narray优于正常数组的优势"我找不到一个明智的答案。你能告诉我什么时候我应该开始使用ndarray吗?在你的实践中,你是同时使用它们还是只使用一个?
对不起,如果问题是新手水平,但我是新的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 for Data Analysis: Data Wrangling with Pandas, NumPy, and IPython