python - 为什么 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 数组一样实现“附加”?
解决方案
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 数组;您应该使用一个列表,并在完成追加后从列表中构建一个数组。
推荐阅读
- javascript - 数据表,点击分页不起作用
- angular - Angular:将组件输入绑定到 Observable 的值属性
- c - MOUSEEVENTF_LEFTDOWN SendInput 后鼠标锁定
- coldfusion - 如何只输出一次查询值?
- asp.net - 从用户收到的 Json 无法转换为我的网络服务器 API 中的类型
- angular - 如何接收变量?
- python - 访问动态布局 id kivy
- azure - Azure 应用程序网关 Web 应用程序防火墙 CRS 设置 crs-setup.conf 的 PARNOIA LEVEL
- c - 为什么来自 C 标准工作组的文档受到密码保护?
- scala - Lagom/Play 应用程序中的 Main 类是什么?