5

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

我尝试用谷歌搜索这个问题的答案:“使用 ndarray 比普通数组有什么好处和优势”我找不到一个明智的答案。你能写下我什么时候应该开始使用 ndarrays,如果在你的实践中你是同时使用它们还是只使用一个。

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

4

4 回答 4

8

NumPy and Python arrays share the property of being efficiently stored in memory.

NumPy arrays can be added together, multiplied by a number, you can calculate, say, the sine of all their values in one function call, etc. As HYRY pointed out, they can also have more than one dimension. You cannot do this with Python arrays.

On the other hand, Python arrays can indeed be appended to. Note that NumPy arrays can however be concatenated together (hstack(), vstack(),…). That said, NumPy arrays are mostly meant to have a fixed number of elements.

It is common to first build a list (or a Python array) of values iteratively and then convert it to a NumPy array (with numpy.array(), or, more efficiently, with numpy.frombuffer(), as HYRY mentioned): this allows mathematical operations on arrays (or matrices) to be performed very conveniently (simple syntax for complex operations). Alternatively, numpy.fromiter() might be used to construct the array from an iterator. Or loadtxt() to construct it from a text file.

于 2013-02-27T11:44:37.767 回答
7

使用 NumPy 数组至少有两个主要原因:

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

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

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

于 2013-02-27T11:50:53.850 回答
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)
于 2013-02-27T12:11:42.817 回答
1

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

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

于 2018-10-30T22:04:02.573 回答