python - 获取 Numpy 数组所有权的函数
问题描述
我有一个函数takes_ownership()
可以对 Numpy 数组执行操作,a
并且有效地依赖于成为数据的所有者。有没有办法改变传递的数组,使其不再指向其原始缓冲区?
动机是处理大量数据的代码(由于性能限制),一个常见的错误是不知道用户回收他们的输入数组。
请注意,这个问题非常具体地不是“如果我改变我的功能,为什么会a
b = a
有所不同” 。问题是当我不能复制时,“我如何才能使使用给定数组对毫无戒心的用户更安全”。
def takes_ownership(a):
b = a
# looking for this step
a.set_internal_buffer([])
# if this were C++ std::vectors, I would be looking for
# b = np.array([])
# a.swap(b)
# an expensive operation that invalidates a
b.resize((6, 6), refcheck=False)
# outside references to a no longer valid
return b
a = np.random.randn(5, 5)
b = takes_ownership(a)
# array no longer has data so that users cannot mess up
assert a.shape = ()
解决方案
NumPy 有一个copy
函数可以克隆一个数组(尽管如果这是一个对象数组,即不是原始数组,克隆后可能仍然存在嵌套的对象引用)。话虽如此,这是一个有问题的设计模式,以不依赖这种条件的方式重写代码可能是更好的做法。
编辑:如果你不能复制数组,你可能需要确保你的其他代码都没有修改它(而不是运行不可变操作来生成新数组)。以这种方式做事可能会导致更多问题,所以我建议重构,这样就没有必要了。
推荐阅读
- javascript - 渲染数组对象列表(Javascript)
- html - 在单个表格元素中调整图像高度
- php - 如何使用 php regex 执行多个搜索?
- node.js - post方法节点js服务器中的请求正文为空
- go - 在运行 exec 时做一些事情
- amazon-textract - AWS Textract - GetDocumentAnalysisRequest 仅返回文档第一页的正确结果
- javascript - acrobat 调试器中的简单脚本 SyntaxError: missing ; 声明之前
- python - pandas - 获得多个最大值
- mysql - mysql查询可以在哪里进行限制吗?
- git - `git fetch` 和 `git push` 用于本地快速转发的区别