I need to square a 2D numpy array (elementwise) and I have tried the following code:
import numpy as np a = np.arange(4).reshape(2, 2) print a^2, '\n' print a*a
that yields:
[[2 3] [0 1]] [[0 1] [4 9]]
Clearly, the notation a*a
gives me the result I want and not a^2
.
I would like to know if another notation exists to raise a numpy array to the power of 2 or N? Instead of a*a*a*..*a
.
power() in Python. numpy. power(arr1, arr2, out = None, where = True, casting = 'same_kind', order = 'K', dtype = None) : Array element from first array is raised to the power of element from second element(all happens element-wise).
To raise a square matrix to the power n in Linear Algebra, use the numpy. linalg. matrix_power() in Python For positive integers n, the power is computed by repeated matrix squarings and matrix multiplications. If n == 0, the identity matrix of the same shape as M is returned.
square() method is used to find the square of every element in a given array. The numpy square() method takes four parameters: arr, out, where, and dtype, and returns a new array with an argument value as the square of the source array elements. To find the square of an array, you can use the numpy square() method.
square(arr, out = None, ufunc 'square') : This mathematical function helps user to calculate square value of each element in the array. Parameters : arr : [array_like] Input array or object whose elements, we need to square.
The fastest way is to do a*a
or a**2
or np.square(a)
whereas np.power(a, 2)
showed to be considerably slower.
np.power()
allows you to use different exponents for each element if instead of 2
you pass another array of exponents. From the comments of @GarethRees I just learned that this function will give you different results than a**2
or a*a
, which become important in cases where you have small tolerances.
I've timed some examples using NumPy 1.9.0 MKL 64 bit, and the results are shown below:
In [29]: a = np.random.random((1000, 1000)) In [30]: timeit a*a 100 loops, best of 3: 2.78 ms per loop In [31]: timeit a**2 100 loops, best of 3: 2.77 ms per loop In [32]: timeit np.power(a, 2) 10 loops, best of 3: 71.3 ms per loop
>>> import numpy >>> print numpy.power.__doc__ power(x1, x2[, out]) First array elements raised to powers from second array, element-wise. Raise each base in `x1` to the positionally-corresponding power in `x2`. `x1` and `x2` must be broadcastable to the same shape. Parameters ---------- x1 : array_like The bases. x2 : array_like The exponents. Returns ------- y : ndarray The bases in `x1` raised to the exponents in `x2`. Examples -------- Cube each element in a list. >>> x1 = range(6) >>> x1 [0, 1, 2, 3, 4, 5] >>> np.power(x1, 3) array([ 0, 1, 8, 27, 64, 125]) Raise the bases to different exponents. >>> x2 = [1.0, 2.0, 3.0, 3.0, 2.0, 1.0] >>> np.power(x1, x2) array([ 0., 1., 8., 27., 16., 5.]) The effect of broadcasting. >>> x2 = np.array([[1, 2, 3, 3, 2, 1], [1, 2, 3, 3, 2, 1]]) >>> x2 array([[1, 2, 3, 3, 2, 1], [1, 2, 3, 3, 2, 1]]) >>> np.power(x1, x2) array([[ 0, 1, 8, 27, 16, 5], [ 0, 1, 8, 27, 16, 5]]) >>>
As per the discussed observation on numerical precision as per @GarethRees objection in comments:
>>> a = numpy.ones( (3,3), dtype = numpy.float96 ) # yields exact output >>> a[0,0] = 0.46002700024131926 >>> a array([[ 0.460027, 1.0, 1.0], [ 1.0, 1.0, 1.0], [ 1.0, 1.0, 1.0]], dtype=float96) >>> b = numpy.power( a, 2 ) >>> b array([[ 0.21162484, 1.0, 1.0], [ 1.0, 1.0, 1.0], [ 1.0, 1.0, 1.0]], dtype=float96) >>> a.dtype dtype('float96') >>> a[0,0] 0.46002700024131926 >>> b[0,0] 0.21162484095102677 >>> print b[0,0] 0.211624840951 >>> print a[0,0] 0.460027000241
>>> c = numpy.random.random( ( 1000, 1000 ) ).astype( numpy.float96 ) >>> import zmq >>> aClk = zmq.Stopwatch() >>> aClk.start(), c**2, aClk.stop() (None, array([[ ...]], dtype=float96), 5663L) # 5 663 [usec] >>> aClk.start(), c*c, aClk.stop() (None, array([[ ...]], dtype=float96), 6395L) # 6 395 [usec] >>> aClk.start(), c[:,:]*c[:,:], aClk.stop() (None, array([[ ...]], dtype=float96), 6930L) # 6 930 [usec] >>> aClk.start(), c[:,:]**2, aClk.stop() (None, array([[ ...]], dtype=float96), 6285L) # 6 285 [usec] >>> aClk.start(), numpy.power( c, 2 ), aClk.stop() (None, array([[ ... ]], dtype=float96), 384515L) # 384 515 [usec]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With