функция для умножения двух костюмов - PullRequest
0 голосов
/ 07 ноября 2018

Мне нужна простая функция numpy, которая делает это умножение без для цикла и более эффективным по времени.

На самом деле я хочу функцию, которая умножает каждую строку от a до b

a=np.arange(2,12).reshape(5,2)
b=np.array([[1,2],[3,4]])
c=np.array([[a[i,:]@b] for i in range(a.shape[0])])

Ответы [ 4 ]

0 голосов
/ 07 ноября 2018

Чтобы использовать @, сделайте a трехмерным массивом (5,1,2) с точными парами с (2,2) (или (1,2,2) при автоматической трансляции).

In [448]: np.array([[a[i,:]@b] for i in range(a.shape[0])])
Out[448]: 
array([[[11, 16]],

       [[19, 28]],

       [[27, 40]],

       [[35, 52]],

       [[43, 64]]])

In [450]: a[:,None,:]@b
Out[450]: 
array([[[11, 16]],

       [[19, 28]],

       [[27, 40]],

       [[35, 52]],

       [[43, 64]]])

Это на самом деле немного быстрее, чем решение einsum - хотя с таким маленьким примером я бы не стал особо задумываться о времени.

0 голосов
/ 07 ноября 2018

Используя numpy einsum , вы можете это сделать (отредактировано, чтобы изменить форму массива на основе answer ответа @ dobkind):

c = np.einsum('ki,ij->kj', a, b).reshape(5,1,2)

что должно быть быстрее.

%timeit np.einsum('ki,ij->kj', a, b).reshape(5,1,2)
1.87 µs ± 10.5 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

против (используя оператор умножения матриц @, который работает в Python 3)

%timeit np.array([[a[i,:]@b] for i in range(a.shape[0])])
10.2 µs ± 36.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
0 голосов
/ 07 ноября 2018

С numpy.tensordot :

c = np.tensordot(a, b, axes=1)

Если вы настаиваете, что shape будет таким же:

c.reshape(5,1,2)
0 голосов
/ 07 ноября 2018

Используйте функцию matmul из numpy для умножения двух матриц. Дайте мне знать, помогает ли это. Спасибо.

c = np.matmul(a,b)
...