Python 乘法运算两个数组
这是接着之前的讨论继续的内容:
我需要进行数组与数组之间的乘法。我不想使用“numpy”。在之前的讨论中,我学会了如何进行数字与数组的乘法:
数字 * 数组:
hh=[[82.5], [168.5]]
N=1./5
ll = [[x*N for x in y] for y in hh]
但是我该如何进行数组 * 数组的乘法呢: ->矩阵乘法。
hh=[[82.5], [168.5]]
N=zip(*hh) -> N must be transpose of hh!!!!!
ll = [[[x*z for x in y] for y in hh] for z in N]
? 谢谢
编辑:
输入:
hh=[[82.5], [168.5]]
N=zip(*hh) #N=[(82.5, 168.5)]
想要的输出:hh*N
[[ 6806.25 13901.25]
[ 13901.25 28392.25]]
4 个回答
3
你的想法是对的,不过可以把它写得简单一点:
list_a = [1,2,3,4,5] # or hh[0]
list_b = [6,7,8,9,0] # or hh[1]
multiplied = [a * b for a, b in zip(list_a, list_b)]
另外,如果你希望 /
这个运算符返回浮点数(小数),可以在你的代码最上面加上 from __future__ import division
。
3
你可以使用列表推导式,就像你之前提到的数字和数组的问题一样。
假设你有两个数组:
a = [1,2,3]
b = [4,5,6]
首先,你可以用zip
把它们组合起来,这样就能得到你想要相乘的配对:
pairs = zip(a,b)
这样会得到[(1, 4), (2, 5), (3, 6)]
。
你可以这样“拆开”一个元组:
val1, val2 = (1,4) # val1=1 and val2=4
把所有东西结合在一起,这样就可以把数组a
和b
相乘:
c = [val1*val2 for val1,val2 in zip(a,b)]
在你上面的例子中,hh
是一个包含你两个数组的数组,结果就变成:
hh=[[82.5], [168.5]]
N=zip(*hh)
ll = [x*y for x,y in N]
2
使用 operator.mul 和 map 函数。
from operator import mul
map(mul, list1, list2)
这是一个 N*hh 的矩阵,其中 N=zip(**hh)。
>>> hh = [[82.5], [168.5]]
>>> [ [i*j for i in x for j in y] for x in hh for y in zip(*hh) ]
[[6806.25, 13901.25], [13901.25, 28392.25]]
>>> hh = [[2], [4]]
>>> [ [i*j for i in x for j in y] for x in hh for y in zip(*hh) ]
[[4, 8], [8, 16]]
>>> hh = [[2], [4], [6]]
>>> [ [i*j for i in x for j in y] for x in hh for y in zip(*hh) ]
[[4, 8, 12], [8, 16, 24], [12, 24, 36]]
>>> hh = [[1, 2, 4]]
>>> [ [i*j for i in x for j in y] for x in hh for y in zip(*hh) ]
[[1, 2, 4], [2, 4, 8], [4, 8, 16]]
>>> hh = [[1, 2], [3, 4]]
>>> [ [i*j for i in x for j in y] for x in hh for y in zip(*hh) ]
[[1, 3, 2, 6], [2, 4, 4, 8], [3, 9, 4, 12], [6, 12, 8, 16]]
如果你想了解其他内容,这里还有几个例子可以帮助你入门:
>>> a = [1, 2, 3]
>>> b = [0, 1, 2]
>>> [ x*y for x in a for y in b]
[0, 1, 2, 0, 2, 4, 0, 3, 6]
>>> [[x*y for x in a] for y in b]
[[0, 0, 0], [1, 2, 3], [2, 4, 6]]