2013-02-27 85 views
4

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

我试着谷歌的问题的答案:“什么是和使用普通阵列ndarray优势”我找不到明智的答案。你可以写什么时候我应该开始使用ndarrays,如果你在实践中使用它们或仅使用一个。

对不起,如果问题是一个新手级别,但我是新的python,只是尝试从Matlab移动,并想了解什么是利弊。谢谢

回答

7

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

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

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

常见的是首先建立的值的列表(或一个Python阵列)迭代,然后将其转换为一个NumPy的阵列(numpy.array(),或者更高效地,具有numpy.frombuffer(),如HYRY提及):这允许数学运算在数组(或矩阵)上执行非常方便(复杂操作的简单语法)。或者,numpy.fromiter()可能用于从迭代器构造数组。或从loadtxt()构建它从一个文本文件。

7

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

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

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

但是,如果你正在寻找一个Python的Python替代品,你肯定会找到用于NumPy的。这是值得学习的。

+1

'array.array'对象*做*有一个'追加()'方法... – EOL 2013-02-27 11:53:02

+0

@EOL:哎呀,你说的很对。 – unutbu 2013-02-27 11:53:52

4

array.array可以动态改变大小。如果您从某个来源收集数据,最好使用array.array。但array.array只是一个维度,并没有计算功能。所以,当你想用你的数据做一些计算时,将它转换为numpy.ndarray,并在numpy中使用函数。

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

这里是一个演示:

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) 
+0

用于提及'array.array'和'numpy.frombuffer()'的单维。 – EOL 2013-03-14 01:01:37

相关问题