Вещание между матрицей и вектором?
Я изучаю 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 ]])