Матричное умножение в стиле numpy - PullRequest
0 голосов
/ 11 марта 2020

У меня есть вектор строки a и вектор столбца b in numpy. Если бы я умножил матрицу на два вектора, я бы получил матрицу m, где m[i,j] = a[i]b[j]. Мне было интересно, существует ли простой способ выполнения этого стиля операции для сложения - то есть получение матрицы n, где n[i,j] = a[i] + b[j]. Есть ли встроенный метод для выполнения чего-то подобного?

Ответы [ 2 ]

1 голос
/ 11 марта 2020

Полагаю, вы имеете в виду np.add?

import numpy as np    

x1 = np.arange(3).reshape((3, 1))
x2 = np.arange(3).reshape((1, 3))
result = np.add(x1, x2)

print(x1, '\n')
print(x2, '\n')
print(result)

Вывод:

[[0]
 [1]
 [2]] 

[[0 1 2]] 

[[0 1 2]
 [1 2 3]
 [2 3 4]]
0 голосов
/ 12 марта 2020

Компактный способ расширения массива (n,) до (n, 1) с помощью индексации np.newaxis или None:

In [30]: a = np.arange(1,5); b = np.arange(1,4)*10                                             
In [31]: a,b                                                                                   
Out[31]: (array([1, 2, 3, 4]), array([10, 20, 30]))
In [32]: a[:,None]+b                                                                           
Out[32]: 
array([[11, 21, 31],
       [12, 22, 32],
       [13, 23, 33],
       [14, 24, 34]])

, где:

In [33]: a[:,None]                                                                             
Out[33]: 
array([[1],
       [2],
       [3],
       [4]])

Процесс broadcasting:

(m,1), (n,) => (m,1),(1,n) => (m,n)

Версия ufunc + равна np.add, и поэтому он имеет метод outer:

In [35]: np.add.outer(a,b)                                                                     
Out[35]: 
array([[11, 21, 31],
       [12, 22, 32],
       [13, 23, 33],
       [14, 24, 34]])

np.outer(a,b) и np.multiply.outer(a,b) и a[:,None]*b являются эквивалентными outer product выражениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...