Как я могу умножить более 3 векторов одновременно в NumPy

#python #numpy #multidimensional-array #numpy-ndarray #multiplication

#python #numpy #многомерный массив #numpy-ndarray #умножение

Вопрос:

Я ищу векторизованный способ умножения более 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])
  

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

Помощь приветствуется 🙂

Комментарии:

1. Можете ли вы объединить их с помощью np.stack , а затем вызвать np.prod вдоль новой оси?

Ответ №1:

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

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

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

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

 >>> np.multiply.reduce((X, Y, Z), axis=1)                                                                                                                                                                                                                
array([  6, 120, 504])
  

Ответ №2:

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


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

>>> np.prod([X, Y, Z], 1)
array([  6, 120, 504])
  

Ответ №3:

Или очень просто использовать обычные * обозначения:

 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])
  

Комментарии:

1. Я как бы предполагал, что вопрос касается переменного аргумента, т.е. multiply_arrays(*arrays) , или multiply_arrays(arrays) (аргумент последовательности). Если нет, это определенно было бы проще