NumPy中的逐元素矩阵乘法

7
我正在进行我的第一次Python和NumPy的真正尝试,以进行一些图像处理。我已经加载了一个作为3维NumPy数组的图像,其中轴0表示图像波段,而轴1和轴2表示像素的列和行。从这里,我需要获取代表每个像素的3x1矩阵,并执行一些操作,结果是另一个3x1矩阵,将用于构建结果图像。
我的第一种方法(简化并使用随机数据)如下:
import numpy as np
import random

factor = np.random.rand(3,3)
input = np.random.rand(3,100,100)
results = np.zeros((3,100,100))

for x in range(100):
    for y in range(100):
        results[:,x,y] = np.dot(factor,input[:,x,y])

但是我觉得这样做不够优雅也不够高效。有没有一种逐元素的方式来完成这个操作,例如:

results = np.dot(factor,input,ElementWiseOnAxis0)

在试图解决这个问题时,我发现了这个问题很相似的帖子。然而,作者无法满意地解决该问题。我希望自2012年以来有些改变,或者我的问题与他们的不同,使得更容易解决。
1个回答

11

Numpy数组默认使用逐元素相乘。查看numpy.einsumnumpy.tensordot。我认为你正在寻找的是像这样的内容:

results = np.einsum('ij,jkl->ikl',factor,input)

这对于这些数据完美地运作,并且也适用于类似的问题,谢谢! - Joe
1
在我的情况下,输入形状为:(100,100,3)。我花了一些时间才理解它,但可能对其他人有用。在我的情况下是:results = np.einsum('ij,klj->kli',factor,input) - Luigolas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接