Как получить поэлементное умножение матриц (произведение Адамара) в numpy?

#python #numpy #matrix #matrix-multiplication #elementwise-operations

#python #numpy #матрица #умножение матрицы #поэлементные операции

Вопрос:

У меня есть две матрицы

 a = np.matrix([[1,2], [3,4]])
b = np.matrix([[5,6], [7,8]])
 

и я хочу получить поэлементное произведение, [[1*5,2*6], [3*7,4*8]] , равное

[[5,12], [21,32]]

Я пробовал

 print(np.dot(a,b)) 
 

и

 print(a*b)
 

но оба дают результат

[[19 22], [43 50]]

что является матричным произведением, а не поэлементным произведением. Как я могу получить поэлементный продукт (он же продукт Адамара), используя встроенные функции?

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

1. Вы уверены a и b не являетесь типом матрицы NumPy? С помощью этого класса * возвращает внутреннее произведение, а не поэлементное. Но для обычного ndarray класса * это означает поэлементное произведение.

2. массивы are a и b numpy? Кроме того, в вашем вопросе выше вы используете x and y для вычисления вместо a and b . Это просто опечатка?

3. a и b являются элементами типа матрицы numpy

4. Всегда используйте массивы numpy, а не матрицы numpy. Посмотрите, что говорят об этом документы numpy . Также обратите внимание, что начиная с python 3.5 , вы можете использовать @ для умножения матриц с массивами numpy, что означает, что не должно быть абсолютно никаких веских причин использовать матрицы поверх массивов.

5. Чтобы быть придирчивым, a и b есть списки. Они будут работать в np.dot ; но не в a*b . Если вы используете np.array(a) или np.matrix(a) , * работает, но с разными результатами.

Ответ №1:

Для поэлементного умножения matrix объектов вы можете использовать numpy.multiply :

 import numpy as np
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
np.multiply(a,b)
 

Результат

 array([[ 5, 12],
       [21, 32]])
 

Однако вам действительно следует использовать array вместо matrix . matrix объекты имеют всевозможные ужасные несовместимости с обычными ndarrays. С помощью ndarrays вы можете просто использовать * для поэлементного умножения:

 a * b
 

Если вы используете Python 3.5 , вы даже не теряете возможность выполнять умножение матриц с помощью оператора, потому @ что теперь выполняется умножение матриц:

 a @ b  # matrix multiplication
 

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

1. Просто чтобы добавить немного контекста: в алгебре эта операция известна как произведение Адамара , и она отличается от более распространенного матричного произведения. en.wikipedia.org/wiki/Hadamard_product_ (матрицы)

Ответ №2:

просто сделайте это:

 import numpy as np

a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])

a * b
 

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

1. нет, это дает умножение матрицы. Облако решает это с помощью numpy.multiply

2. Какую версию и младшую версию Python вы используете? А из numpy?

3. Используя Intel Python 3.5.2 с numpy 1.12.1, * оператор, по-видимому, выполняет поэлементное умножение.

4. Это работает для меня с Numpy 1.12.1 на Python 3.5.2 (построенный с использованием gcc) тоже.

5. @Malintha, я думаю, ты делаешь a = np.**матрица**([[1,2],[3,4]]) вместо этого

Ответ №3:

 import numpy as np
x = np.array([[1,2,3], [4,5,6]])
y = np.array([[-1, 2, 0], [-2, 5, 1]])

x*y
Out: 
array([[-1,  4,  0],
       [-8, 25,  6]])

%timeit x*y
1000000 loops, best of 3: 421 ns per loop

np.multiply(x,y)
Out: 
array([[-1,  4,  0],
       [-8, 25,  6]])

%timeit np.multiply(x, y)
1000000 loops, best of 3: 457 ns per loop
 

Оба np.multiply и * приведут к поэлементному умножению, известному как произведение Адамара

%timeit является ли ipython волшебным

Ответ №4:

Попробуйте это:

 a = np.matrix([[1,2], [3,4]])
b = np.matrix([[5,6], [7,8]])

#This would result a 'numpy.ndarray'
result = np.array(a) * np.array(b)
 

Здесь np.array(a) возвращает 2D массив типа ndarray , и умножение на два ndarray приведет к поэлементному умножению. Таким образом, результат будет:

 result = [[5, 12], [21, 32]]
 

Если вы хотите получить матрицу, сделайте это с помощью этого:

 result = np.mat(result)
 

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

1. Пожалуйста, объясните, что это делает.

2. @LeopoldJoy Я только что отредактировал свой ответ, надеюсь, это поможет :))

Ответ №5:

 error: OpenCV(4.6.0) /io/opencv/modules/core/src/arithm.cpp:230: error: (-215:Assertion failed) (mtype == CV_8U || mtype == CV_8S) amp;amp; _mask.sameSize(*psrc1) in function 'binary_op'
 

Это ошибка, когда я пытался. Реализовал ЛОГИКУ

 def masking_rgb(im_rgb,im_mask):
  r1,c1=im_mask.shape
  for i in range(r1):
    for j in range (c1):
      if im_mask[i,j]==0:
        im_rgb[i,j,:]=0
  return im_rgb

im_rgb=masking_rgb(im_rgb,im_mask)
plt.imshow(im_rgb)
plt.show()