首页 > 解决方案 > 为什么 numpy ndarray 的 insert 和 append 会返回一个新数组而不是修改原始数组?

问题描述

对于 numpy ndarray,没有附加和插入,就像原生 python 列表一样。

a = np.array([1, 2, 3])
a.append(5)  # this does not work
a = np.append(a, 5)  # this is the only way

而对于原生 python 列表,

a = [1, 2, 3]
a.append(4)  # this modifies a
a  # [1, 2, 3, 4]

为什么 numpy ndarray 设计成这样?我正在编写 ndarray 的子类,有没有办法像原生 python 数组一样实现“附加”?

标签: pythonarraysnumpy

解决方案


NumPy 大量使用视图,这是 Python 列表不支持的功能。视图是一个数组,它使用另一个对象的内存而不是拥有自己的内存;例如,在以下代码段中

a = numpy.arange(5)
b = a[1:3]

b是一个视图a

视图与就地append或其他就地大小更改操作的交互非常差。数组将突然不再是它们应该是视图的数组的视图,或者它们将是释放内存的视图,或者无法预测一个append单一的数组是否会影响它是视图的数组,或者各种其他问题。例如,a之后会是什么样子b.append(6)?或者b之后会是什么样子a.clear()?您可以做出什么样的性能保证?可能不是 的摊销常数时间保证list.append

如果你愿意append,你可能不应该使用 NumPy 数组;您应该使用一个列表,并在完成追加后从列表中构建一个数组。


推荐阅读