Ramesh-X Ramesh-X - 15 days ago 5
Python Question

Equivalent using numpy

For some work that I am doing recently, I need the following operation to be done.

def myfunc(a, b):
return a*b # some operation here

a = [1,2,3]
b = [2,4,6,8]
print [[myfunc(i, j) for i in a] for j in b]


I need to create a 2D array from 1D arrays as shown above.

Can someone please tell me a way to do this using
numpy
operations..?


The arrays
a
and
b
are really long. So I'm assuming numpy will increase the performance.

Answer

You can use numpy broadcasting:

a = np.array([1,2,3])
b = np.array([2,4,6,8])
a = a[:, None]
b = b[None, :]

a * np.log(a/b)

adding a new axis to a and b (as second and first axis respectively) will make a's shape (3, 1) and b's shape (1, 4). Then, a/b a 2D (3, 4) array where the i-th column is a[i]/b:

a/b
array([[ 0.5       ,  0.25      ,  0.16666667,  0.125     ],
       [ 1.        ,  0.5       ,  0.33333333,  0.25      ],
       [ 1.5       ,  0.75      ,  0.5       ,  0.375     ]])

Then you can take the pointwise log and multiply by a. Since np.log(a/b) is (3, 4) and a is (3, 1), a will again be broadcasted to (3, 4).

A small subtlety is that, due to the way broadcasting happens, adding the second axis to b is not mandatory. I prefer writing it out explicitly nevertheless, for clarity.

Comments