问题
As in title, I need to perform numpy.exp
on a very large ndarray, let's say ar
, and store the result in ar
itself. Can this operation be performed in-place?
回答1:
You can use the optional out
argument of exp
:
a = np.array([3.4, 5])
res = np.exp(a, a)
print(res is a)
print(a)
Output:
True
[ 29.96410005 148.4131591 ]
exp(x[, out])
Calculate the exponential of all elements in the input array.
Returns
out : ndarray Output array, element-wise exponential of
x
.
Here all elements of a
will be replaced by the result of exp
. The return value res
is the same as a
. No new array is created
回答2:
Mike Mueller's answer is good but please note that if your array is of type int32
, int
, int64
etc., it will throw a TypeError
. Thus, a safe way to do this is to typecast your array to float64
or float32
etc., before doing exp
like,
In [12]: b
Out[12]: array([1, 2, 3, 4, 5], dtype=int32)
In [13]: np.exp(b, b)
--------------------------------------------------------------------------
TypeError: ufunc 'exp' output (typecode 'd') could not be coerced to provided
output parameter (typecode 'i') according to the casting rule ''same_kind''
Type Casting & exp:
# in-place typecasting
In [14]: b = b.astype(np.float64, copy=False)
In [15]: b
Out[15]: array([ 1., 2., 3., 4., 5.], dtype=float64)
# modifies b in-place
In [16]: np.exp(b, b)
Out[16]: array([ 2.718, 7.389, 20.086, 54.598, 148.413], dtype=float64)
来源:https://stackoverflow.com/questions/41245775/perform-numpy-exp-function-in-place