Python\Numpy中数组行乘法循环

1 投票
1 回答
1920 浏览
提问于 2025-04-17 19:08

我想把数组A的每一行都乘以数组B的每一行,这样我就能得到和前两个数组一样数量的数组,每个数组的行数和列数也都相同。

有没有人能帮帮我?

pseudo-code
from numpy  import *
import numpy as np

def multipar():
    A = array( [ (0.1,0.5,0.2,0.2), (0.2,0.5,0.1,0.2), (0.7,0.1,0.1,0.1) ] )
    B = array( [ (1,2,3,4), (2,3,4,5), (3,4,5,6) ] )
    for i in len(A):
        average = A[i]*B
    print average

multipar() 

我希望每个得到的新数组都能这样生成。

Array C
(0.1,0.5,0.2,0.2) * (1,2,3,4);
(0.1,0.5,0.2,0.2) * (2,3,4,5);
(...)
Array D
(0.2,0.5,0.1,0.2) * (1,2,3,4);
(...)

1 个回答

2

你可以尝试在更高的维度上做一些有趣的事情。可以把 A 或者 B 扩展到第三维度,然后把它和没有扩展的那个进行相乘。比如:

A = array( [ (0.1,0.5,0.2,0.2), (0.2,0.5,0.1,0.2), (0.7,0.1,0.1,0.1) ] )
B = array( [ (1,2,3,4), (2,3,4,5), (3,4,5,6) ] )

tiled = tile (B, (3,1,1)).swapaxes (0,1)
all_results = A*tiled

现在你所有的结果数组都在 all_results 里;你可以很方便地用 all_results[0]all_results[1] 等来获取它们。

补充说明:针对最近的问题更新: 如果你真的需要把结果数组分开,那么还有两个选择:

  • C, D, E = all_results
  • 把我第一个建议中的最后两条语句替换为:

    C = B * A[0]

    D = B * A[1]

    E = B * A[2]

如果你确实需要将结果放在不同的数组里,并且行数很多,以至于需要用到循环,那么你可以这样做(感谢 @Jaime 提供的广播表示法):

all_results = A[:, None, :] * B[None, :, :]
for i, res in enumerate (all_results):
    locals () ['result%d'%i] = res

现在,乘以第一行的结果在一个叫 res1 的变量里,第二行的结果在 res2 里,依此类推。

撰写回答