#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)
(аргумент последовательности). Если нет, это определенно было бы проще