Вещание между матрицей и вектором?

Я изучаю NumPy линейную алгебру, и я хочу выполнить простой расчет: у меня есть:

m = np.array([[1,2],
              [3,4],
              [5,6]]
v = np.array([10,20,30])

что я хочу рассчитать / вывести:

[ [1/10, 2/10], 
  [3/20, 4/20],
  [5/30, 6/30]]

в основном, чтобы выполнить поэлементное деление между каждой строкой m и каждым элементом v

Я, вероятно, могу сделать это с помощью цикла for, но я бы хотел знать "правильные" способы сделать это.

Я чувствую, что это как-то связано с вещанием, но это все.

Благодарю.

1 ответ

Вам необходимо выровнять элементы v до первой оси m, Одним из способов сделать это было бы продлить v в 2D массив с np.newaxis/None а потом broadcasting вступает в игру при выполнении поэлементного деления. Кроме того, поскольку оба входа являются целочисленными массивами, и вы выполняете деление, вам необходимо преобразовать один из них в число с плавающей точкой, прежде чем выполнять поэлементное деление. Таким образом, окончательная реализация будет -

m/v[:,None].astype(float)

Вы можете избежать преобразования в массив с плавающей запятой на уровне пользователя, если используете функцию истинного деления NumPy. np.true_divide это заботится о преобразовании с плавающей запятой под капотом. Таким образом, реализация с ним будет -

np.true_divide(m,v[:,None])

Пробный прогон -

In [203]: m
Out[203]: 
array([[1, 2],
       [3, 4],
       [5, 6]])

In [204]: v
Out[204]: array([10, 20, 30])

In [205]: m/v[:,None].astype(float)
Out[205]: 
array([[ 0.1       ,  0.2       ],
       [ 0.15      ,  0.2       ],
       [ 0.16666667,  0.2       ]])

In [206]: np.true_divide(m,v[:,None])
Out[206]: 
array([[ 0.1       ,  0.2       ],
       [ 0.15      ,  0.2       ],
       [ 0.16666667,  0.2       ]])
Другие вопросы по тегам