Поэлементное умножение нескольких массивов в Python Numpy

Написав несколько подпрограмм квантовой механики, я обнаружил любопытное поведение Python NumPy. Когда я использую умножение NumPy с более чем двумя массивами, я получаю неверные результаты. В приведенном ниже коде я должен написать:

f = np.multiply(rowH,colH)
A[row][col]=np.sum(np.multiply(f,w))

что дает правильный результат. Однако моя первоначальная формулировка была такой:

A[row][col]=np.sum(np.multiply(rowH, colH, w))

что приводит не к сообщению об ошибке, а к неверному результату. В чем моя вина, что я думаю, что могу передать три массива подпрограмме умножения numpy?

Вот полный код:

from numpy.polynomial.hermite import Hermite, hermgauss
import numpy as np
import matplotlib.pyplot as plt

dim = 3
x,w = hermgauss(dim)
A = np.zeros((dim, dim))
#build matrix
for row in range(0, dim):
    rowH = Hermite.basis(row)(x)
    for col in range(0, dim):
        colH = Hermite.basis(col)(x)
        #gaussian quadrature in vectorized form
        f = np.multiply(rowH,colH)
        A[row][col]=np.sum(np.multiply(f,w))
print(A)

:: ПРИМЕЧАНИЕ :: этот код работает только с NumPy 1.7.0 и выше!


person seb    schedule 19.04.2013    source источник


Ответы (3)


Ваша вина заключается в том, что вы не читаете документацию:

numpy.multiply(x1, x2[, out])

multiply принимает ровно два входных массива. Необязательный третий аргумент - это выходной массив, который можно использовать для хранения результата. (Если он не указан, создается и возвращается новый массив.) Когда вы передали три массива, третий массив был перезаписан продуктом первых двух.

person BrenBarn    schedule 19.04.2013
comment
окей плохо :-). я должен удалить этот пост или вы думаете, что это полезно для других? - person seb; 19.04.2013
comment
Оставь это. помог мне :) - person mrjrdnthms; 11.04.2014
comment
Итак, есть ли возможность умножить несколько массивов за один вызов (в последней версии) или нам нужно объединить вызовы в цепочку? - person Nagabhushan S N; 03.09.2018

Для тех, кто наткнулся на это, лучший способ применить поэлементное умножение n np.ndarray формы (d, ) - сначала np.vstack их и применить np.prod на первой оси:

>>> import numpy as np
>>>
>>> arrays = [
...   np.array([1, 2, 3]),
...   np.array([5, 8, 2]),
...   np.array([9, 2, 0]),
... ]
>>>
>>> print(np.prod(np.vstack(arrays), axis=0))
[45 32  0]
person valentin    schedule 25.10.2019

Да! Просто как делать * с np.arrays

import numpy as np
a=np.array([2,9,4])
b=np.array([3,4,5])
c=np.array([10,5,8])
d=a*b*c
print(d)

Производить:

[ 60 180 160]
person Sergio Morales    schedule 17.06.2019