【问题标题】:Python multiply 2 arraysPython乘以2个数组
【发布时间】:2011-04-28 22:14:09
【问题描述】:

这是从线程继续: Python array multiply

我需要将数组与数组相乘。我不想使用“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]]

【问题讨论】:

  • 使用numpy有什么问题?
  • 你最好提到你正在寻找矩阵乘法。

标签: python arrays


【解决方案1】:

你的想法是对的,但你可以写得简单一点:

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

【讨论】:

    【解决方案2】:

    您可以使用列表推导,就像您之前的数字 * 数组问题一样。

    假设你有两个数组:

    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
    

    将所有内容组合在一起,这将是多个数组ab

    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]
    

    【讨论】:

    • 这最后我知道,我想乘(矩阵 * 矩阵)所以结果必须是矩阵,而不是标量或数字...
    【解决方案3】:

    使用 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]]
    

    【讨论】:

    • 迄今为止最好最简洁的答案。
    • 谢谢它,它简单明了,但 b 必须是 a 的转置;如果我在您的代码 zip(*b) 上使用,收到有关它“支持迭代”的错误??
    • @Joce,谢谢,不过我可能刚刚成功污染了它。
    • @thaking,你能提供你想看的输入和输出吗?
    • @thaking,太棒了。我有东西……不知道能不能坚持。告诉我。
    【解决方案4】:

    基于上一个问题,我假设您想要矩阵乘法,而不是元素乘法...

    m = range(len(hh))
    n = range(len(N[0]))
    p = range(len(N))
    ll = [[sum(hh[i][k]*N[k][j] for k in p) for j in n] for i in m]
    

    【讨论】:

    • 好评:ll = [[sum(hh[i0][j]*N[i][j0] for j in n for i in m) for j0 in n] for i0 in m ] IndexError: list index out of range 是我想要矩阵matrix hhhh(transpose)
    • @thaking:对不起,它坏了。我已经修改了我的答案。它应该适用于任何一对矩阵,MxP * PxN,而不仅仅是 MxN * NxM。
    猜你喜欢
    • 2021-12-30
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    • 2016-07-21
    • 2023-04-10
    • 1970-01-01
    相关资源
    最近更新 更多