使用ndarray而不是Python数组的原因是什么
我创建了一个类,用来处理一些即将到来的数据。这些数据是以数组的形式存在的,没有使用numpy这个库。在我的代码中,我经常使用.append
来创建另一个数组。后来,我把一个大的数组从1000x2000的格式改成了numpy.array。结果我开始遇到一个接一个的错误。我尝试把所有的数组都转换成ndarray,但像.append
这样的用法就不再有效了。我开始在处理行、列或单元格时遇到问题,结果不得不重写所有的代码。
我试着在网上搜索“使用ndarray相比普通数组有什么好处”,但找不到一个合理的答案。你能告诉我什么时候应该开始使用ndarray吗?在你的实践中,你是同时使用这两种数组,还是只用其中一种呢?
抱歉如果这个问题显得有些初级,但我刚接触python,之前用的是Matlab,想了解一下这两者的优缺点。谢谢!
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)
使用NumPy数组主要有两个好处:
- NumPy数组占用的空间比Python列表少。所以你可以在NumPy数组中处理比Python列表更多的数据(在内存中)。
- NumPy数组有很多函数和方法,这些是Python列表或Python数组所没有的。
不过,你不能简单地把列表转换成NumPy数组,然后就指望你的代码还能正常运行。因为它们的方法不同,布尔值的处理方式也不同。为了获得最佳性能,甚至可能需要改变算法。
但是,如果你在找Python来替代Matlab,NumPy绝对会派上用场。学会它是很有价值的。
NumPy和Python数组都有一个共同点,就是它们在内存中存储得很高效。
NumPy数组可以进行加法、乘法,你可以一次性计算它们所有值的正弦,比如说,等等。正如HYRY提到的,NumPy数组还可以有多个维度,而Python数组就做不到这一点。
另一方面,Python数组确实可以添加新的元素。不过,NumPy数组也可以通过一些方法连接在一起,比如用hstack()
和vstack()
等。不过,通常来说,NumPy数组的元素数量是固定的。
通常,我们会先创建一个值的列表(或者Python数组),然后再把它转换成NumPy数组(可以用numpy.array()
,或者更高效的方式是用numpy.frombuffer()
,正如HYRY提到的):这样可以很方便地对数组(或矩阵)进行数学运算(用简单的语法来处理复杂的操作)。另外,你也可以用numpy.fromiter()
从一个迭代器构建数组,或者用loadtxt()
从文本文件中构建数组。