Хотя название вашего вопроса немного неправильное, я думаю, что проблема, с которой вы столкнулись, в основном связана с numpy
правилами вещания .Таким образом, следующее не будет работать (как вы уже заметили):
In []: N= 5
In []: A= rand(N, 2)
In []: A.shape
Out[]: (5, 2)
In []: S= rand(N)
In []: S.shape
Out[]: (5,)
In []: A* S
------------------------------------------------------------
Traceback (most recent call last):
File "<ipython console>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (5,2) (5)
Однако, теперь простой способ сделать S
совместимым с правилами вещания (поэлементного произведения A* S
),расширить его размерность, например:
In []: A* S[:, None]
Out[]:
array([[ 0.54216549, 0.04964989],
[ 0.41850647, 0.4197221 ],
[ 0.03790031, 0.76744563],
[ 0.29381325, 0.53480765],
[ 0.0646535 , 0.07367852]])
Но это действительно ничего, кроме синтаксического сахара для expand_dims , например:
In []: expand_dims(S, 1).shape
Out[]: (5, 1)
В любом случае, я лично предпочитаю этопростой подход без проблем:
In []: S= rand(N, 1)
In []: S.shape
Out[]: (5, 1)
In []: A* S
Out[]:
array([[ 0.40421854, 0.03701712],
[ 0.63891595, 0.64077179],
[ 0.03117081, 0.63117954],
[ 0.24695035, 0.44950641],
[ 0.14191946, 0.16173008]])
Таким образом, с python
;быть более простым, чем явным, явным.