Как я могу умножить более 3 векторов одновременно в NumPy - PullRequest
1 голос
/ 09 апреля 2019

Я ищу векторизованный способ умножения более 3 векторов в NumPy.

Например,

X = np.array([1,2,3])
Y = np.array([4,5,6])
Z = np.array([7,8,9])


Multiply([X,Y,Z])

выдаст в качестве вывода

np.array([28, 80, 162])

Векторы, которые я хочу умножить, не нужно определять отдельно, как я делал выше. Это могут быть, например, строки (или столбцы) матрицы, и в этом случае я хотел бы умножить все строки (или столбцы) такой матрицы.

Помогает оценить:)

Ответы [ 3 ]

2 голосов
/ 09 апреля 2019

Вы можете использовать numpy.prod, который использует multiply.reduce под капотом.


>>> np.prod([X, Y, Z], 0)
array([ 28,  80, 162])

>>> np.prod([X, Y, Z], 1)
array([  6, 120, 504])
2 голосов
/ 09 апреля 2019

Вы можете использовать reduce метод ufunc:

>>> np.multiply.reduce((X, Y, Z))                                                                                                                                                                                                                        
array([ 28,  80, 162])

Здесь происходит то, что ufunc np.multiply, который выглядит и действует как функция, является технически экземпляром класса numpy.ufunc; все ufuncs имеют четыре специальных метода , один из которых - .reduce(), который делает то, что вы ищете в этом случае и выдает 1d результат из нескольких 1d массивов одинаковой длины.

Ось по умолчанию равна 0; если вы хотите работать вдоль другой оси, просто укажите, что:

>>> np.multiply.reduce((X, Y, Z), axis=1)                                                                                                                                                                                                                
array([  6, 120, 504])
0 голосов
/ 09 апреля 2019

Или очень просто используйте обычную * запись:

In [180]: X * Y * Z
Out[180]: array([ 28,  80, 162])

В общем, вы можете использовать столько массивов, сколько вам нужно:

In [181]: X * Y * Z * X * Y * Z
Out[181]: array([  784,  6400, 26244])
...