首页 > 解决方案 > 获取 Numpy 数组所有权的函数

问题描述

我有一个函数takes_ownership()可以对 Numpy 数组执行操作,a并且有效地依赖于成为数据的所有者。有没有办法改变传递的数组,使其不再指向其原始缓冲区?

动机是处理大量数据的代码(由于性能限制),一个常见的错误是不知道用户回收他们的输入数组。

请注意,这个问题非常具体地不是“如果我改变我的功能,为什么会ab = 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 = ()

标签: pythonnumpynumpy-ndarray

解决方案


NumPy 有一个copy函数可以克隆一个数组(尽管如果这是一个对象数组,即不是原始数组,克隆后可能仍然存在嵌套的对象引用)。话虽如此,这是一个有问题的设计模式,以不依赖这种条件的方式重写代码可能是更好的做法。

编辑:如果你不能复制数组,你可能需要确保你的其他代码都没有修改它(而不是运行不可变操作来生成新数组)。以这种方式做事可能会导致更多问题,所以我建议重构,这样就没有必要了。


推荐阅读