【问题标题】:Element-wise matrix multiplication in NumPyNumPy 中的逐元素矩阵乘法
【发布时间】:2014-11-13 08:34:49
【问题描述】:

我第一次真正尝试使用 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)

在试图找到解决此问题的方法时,我遇到了this 问题,这显然非常相似。但是,作者无法让他们满意地解决问题。我希望自 2012 年以来发生了一些变化,或者我的问题与他们的问题有很大不同,因此更容易解决。

【问题讨论】:

    标签: python arrays image-processing numpy matrix-multiplication


    【解决方案1】:

    Numpy 数组默认使用逐元素乘法。查看 numpy.einsum 和 numpy.tensordot。我认为您正在寻找的是这样的:

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

    【讨论】:

    • 这对这些数据非常有效,应该也能适应类似的问题,谢谢!
    • 在我的例子中,输入形状是:(100, 100, 3)。我花了一段时间才理解它,但可能对其他人有用。就我而言,它是: results = np.einsum('ij,klj->kli',factor,input)
    猜你喜欢
    • 2019-10-13
    • 2019-11-23
    • 2016-06-04
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 2018-12-20
    相关资源
    最近更新 更多