python тихо перемещая массивы ранга 1 - PullRequest
0 голосов
/ 22 февраля 2020
import numpy as np
x1 = np.arange(9.0).reshape((3, 3))
print("x1\n",x1,"\n")
x2 = np.arange(3.0)
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)

дает

x1
 [[0. 1. 2.]
 [3. 4. 5.]
 [6. 7. 8.]] 

x2
 [0. 1. 2.]
(3,) 

Here, the shape of x2 is 3 rows by 1 column 
x1@x2 =
 [ 5. 14. 23.]

x2@x1  should not be possible, BUT
 [15. 18. 21.] 

Python3, кажется, молча преобразует x2 в (1,3) массив, так что его можно умножить на x1. Или мне не хватает какого-то синтаксиса?

1 Ответ

1 голос
/ 22 февраля 2020

Массивы транслируются на 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)
...