python 遍历数组矩阵

python iterate over arrays matrices

我正在尝试创建一个新矩阵(数组)

a = [1, 2, 3]

b = [0, 1, 2]

哪里

C = [[1*0, 1*1, 1*2], [2*0, 2*1, 2*2], [3*0, 3*1, 3*2]]

我一直在搜索 numpy 中的文档,但找不到满足此要求的函数。

for i in a:
    c = np.multiply(a, b)
    for j in b:
        c = np.multiply(a, b)

您正在寻找 numpy.matmul。您需要使向量具有两个维度(其中一个维度的大小为一)。例如:

np.matmul(np.array([[1],[2],[3]]), np.array([[2,3,4]]))

考虑您的输入和输出。您需要两个数组相乘得到一个 3x3 数组。当您的输入数组的形状为 3xn 和 nx3 时,可能会发生这种情况,其中 n 是任何整数。具体来说,对于您的情况,您有 3x1 和 1x3 数组。

因此只需将数组转换为正确的形状,然后将它们相乘即可。请注意,@ 表示矩阵乘法。

import numpy as np
a = np.array([1, 2, 3])
b = np.array([0, 1, 2])

c = a.reshape(3, 1) @ b.reshape(1, 3)
print(c)

有几种方法。这通常称为 outer product:

In [46]: a=np.array([1,2,3]); b=np.array([0,1,2])

In [47]: np.outer(a,b)
Out[47]: 
array([[0, 1, 2],
       [0, 2, 4],
       [0, 3, 6]])

带广播的逐元素乘法也很有效:

In [48]: a[:,None]*b
Out[48]: 
array([[0, 1, 2],
       [0, 2, 4],
       [0, 3, 6]])

这会将 (N,1) 数组与 (M) 相乘得到 (N,M)。但是你需要阅读 broadcasting.

它也可以作为矩阵乘法来完成,通过制作 (N,1) 和 (1,M) 数组(在大小为 1 的维度上求和)。阅读 np.matmul 文档了解详情。

In [49]: a[:,None]@b[None,:]
Out[49]: 
array([[0, 1, 2],
       [0, 2, 4],
       [0, 3, 6]])

对于列表,纯迭代的解决方案是:

In [50]: [[i*j for j in b] for i in a]
Out[50]: [[0, 1, 2], [0, 2, 4], [0, 3, 6]]