Массивы транслируются на Numpy.
Чтобы процитировать вещательную документацию:
Термин "широковещание" описывает, как numpy относится к массивам с различными формами во время арифметических c операций. С учетом определенных ограничений, меньший массив «транслируется» по большому массиву, чтобы они имели совместимые формы. Широковещание предоставляет средства векторизации операций с массивами, так что зацикливание происходит в C вместо Python. Это делает это без создания ненужных копий данных и обычно приводит к эффективной реализации алгоритма. Однако в некоторых случаях широковещательная передача является плохой идеей, поскольку она приводит к неэффективному использованию памяти, что замедляет вычисления.
Добавьте следующую строку в код, где вы явно задаете форму x2
на (3,1)
, и вы получите сообщение об ошибке:
import numpy as np
x1 = np.arange(9.0).reshape((3, 3))
print(x1.shape) # new line added
print("x1\n",x1,"\n")
x2 = np.arange(3.0)
x2 = x2.reshape(3, 1) # new line added
print("x2\n",x2)
print(x2.shape,"\n")
print("Here, the shape of x2 is 3 rows by 1 column ")
print("x1@x2\n",x1@x2)
print("")
print("x2@x1 should not be possible\n",x2@x1,"\n"*3)
Выход
(3, 3)
x1
[[0. 1. 2.]
[3. 4. 5.]
[6. 7. 8.]]
x2
[[0.]
[1.]
[2.]]
(3, 1)
Here, the shape of x2 is 3 rows by 1 column
x1@x2
[[ 5.]
[14.]
[23.]]
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-12-c61849986c5c> in <module>
12 print("x1@x2\n",x1@x2)
13 print("")
---> 14 print("x2@x1 should not be possible\n",x2@x1,"\n"*3)
ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 3 is different from 1)