我有一个函数必须用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的情况下修改数组。
答案 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]])