Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Perform numpy exp function in-place

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?

like image 305
aretor Avatar asked Dec 20 '16 15:12

aretor


2 Answers

You can use the optional outargument 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

like image 197
Mike Müller Avatar answered Nov 15 '22 11:11

Mike Müller


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)
like image 25
kmario23 Avatar answered Nov 15 '22 12:11

kmario23