#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
andy
для вычисления вместоa
andb
. Это просто опечатка?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()