繁体   English   中英

Python - 是否有使用 Numpy 进行矩阵乘法的快速方法

[英]Python - Is there a quick method with Numpy for matrix multiplication

嘿,我有一个问题。 我目前已经在 Numba 中编写了部分代码。 对于我的二进制矩阵中的每个单独元素,应采用其 3x3 邻域 [i-1: i + 2, j-2: j + 2]。 我将此邻域乘以矩阵 [[64, 128, 1], [32, 0, 2], [16, 8, 4]] 并形成总和。 我知道 Numba 在某些地方与 Numpy 相处得不是很好。 是否有 Numpy function 可以对我的 NxM 矩阵中的所有元素完全执行此 function ? 就我而言,结果可以作为中间结果保存在另一个矩阵中,然后使用索引调用。

    for i in prange(1, h - 1):
        for j in range(1, w - 1):
            neighbor = lastResult[i - 1 : i + 2, j - 1 : j + 2]
            x = sum(nb * pattern)

先感谢您。

看起来您正在计算卷积。 看起来 numpy 有一个 function 用于一维(数组)卷积( 链接)。 Scipy 支持二维(矩阵)卷积( 链接)。

从文档中,看起来您将使用 convolve2d function 如下,其中 A 是您的 MxN 矩阵,h 是您想要将 A 中的每个 window 乘以的 3x3 矩阵。

result=scipy.signal.convolve2d(A, h, mode='same', boundary='fill', fillvalue=0)

在每个元素乘以 h 中的相应值之后,结果将包含原始矩阵 A 的元素 i,j 周围的 3x3 邻域之和。

也许像这样缩放和添加?

import numpy as np

a = np.random.randint(2, size=(10, 10))
print(a)

s = slice(None, -2)
t = slice(1, -1)
u = slice(2, None)
print(
     64 * a[s, s] + 128 * a[s, t] + 1 * a[s, u] +
     32 * a[t, s] +                 2 * a[t, u] +
     16 * a[u, s] +   8 * a[u, t] + 4 * a[u, u]
)

演示 output:

[[0 0 1 0 1 0 0 1 1 0]
 [0 0 0 1 1 0 0 1 0 1]
 [1 1 1 0 0 0 0 1 1 0]
 [0 1 1 0 1 0 0 0 0 1]
 [0 1 1 1 0 0 0 1 0 1]
 [1 1 1 1 1 1 1 1 0 0]
 [0 0 1 0 1 1 0 0 1 0]
 [1 0 0 1 0 0 0 0 1 1]
 [1 1 1 1 0 0 0 0 0 1]
 [0 1 1 1 1 1 1 0 1 1]]
[[ 29 154  83 160  96   7 141 250]
 [ 46  57 181 200  80   3 130 101]
 [207 252 122  16  32   5 137 214]
 [159 254 125 188  92  30  24  51]
 [167 235 246 110  58  51 164 105]
 [211 197 235 211 225 225 198  76]
 [ 61 158  89 177 192  64   3 134]
 [110  63 188 124  28  24  21 143]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM