如何在没有隐藏额外内存分配的情况下修改numpy数组?

时间:2014-10-29 14:01:58

标签: python arrays numpy

我有一个函数必须用f(x)替换numpy数组X的每个元素x。

def modify_inplace(X):
    X = 2. / (8. + numpy.exp(-X))

但这不起作用:

>>> X = numpy.random.random( size=(2,3) )
>>> X
array([[ 0.97476386,  0.76411101,  0.37690288],
       [ 0.05462798,  0.44722799,  0.23570353]])
>>>> modify_inplace(X)
>>> X
array([[ 0.97476386,  0.76411101,  0.37690288],
       [ 0.05462798,  0.44722799,  0.23570353]])

我知道,我可以简单地返回新数组,但是我想知道是否可以修改numpy数组,以便不会分配额外的内存?

Ashwini Chaudhary在下面提供了一个解决方案,但这并不是我想要的,因为我需要在没有任何额外malloc的情况下修改数组。

2 个答案:

答案 0 :(得分:6)

针对此案例的真正就地方法可能是:

def modify_inplace(X):
    np.exp(X, out=X)
    X += 8.
    np.power(X, -1, out=X)
    X *= 2

与@Ashwini Chaudhary的方法相比有两个主要优势(这也很好):

  • 不需要分配新数组
  • 操作后无需复制数据

编辑:

请注意,对于更复杂的表达式X多次出现,很难避免复制,例如:

(X + 2.)/(8. + np.exp(X))

此处当您更改X就地计算np.exp(X)时,计算表达式的其余部分将不再有效...

答案 1 :(得分:3)

目前,您只是创建一个新的局部变量X并为其指定一个新值,以更新函数内部X指向的对象使用切片分配 [: ]

>>> def modify_inplace(X):
        X[:] = 2. / (8. + numpy.exp(-X))
...     
>>> X = numpy.random.random( size=(2,3))
>>> X
array([[ 0.21210661,  0.03573271,  0.07002263],
       [ 0.77282535,  0.13973994,  0.82784145]])
>>> modify_inplace(X)
>>> X
array([[ 0.22704366,  0.22309233,  0.22390467],
       [ 0.23635894,  0.22548971,  0.23705132]])