【问题标题】:Multiply Numpy arrays by distributing terms通过分配项将 Numpy 数组相乘
【发布时间】:2014-04-06 13:54:29
【问题描述】:

我在文件中有两个一维 numpy 数组。

'test1'=(2,3)

'test2'=(5,6,7)

我想把它们相乘得到

t=(10, 12, 14, 15, 18, 21)

我正在使用这个程序

import numpy as np

a=open('test1')
b=open('test2')
c=open('test3','w+')
t1=np.loadtxt(a)
t2=np.loadtxt(b)
t=t1*t2

print >> c, t

当我运行程序时,出现以下错误..

ValueError: 操作数无法与形状一起广播 (2) (3)

我应该怎么做才能得到想要的结果?

【问题讨论】:

标签: python arrays numpy matrix multiplication


【解决方案1】:

使用numpy.outernumpy.ravel

>>> import numpy as np
>>> a = np.array((2,3))
>>> b = np.array((5,6,7))
>>> np.outer(a,b).ravel()
array([10, 12, 14, 15, 18, 21])

编辑:

减法:我们不能使用numpy.outer,但我们可以使用numpy.newaxis

>>> (a[:, np.newaxis] - b).ravel()
array([-3, -4, -5, -2, -3, -4])

【讨论】:

  • 减法怎么做?
  • @user3503704,我添加了减法大小写。
【解决方案2】:

您可以使用广播功能。这是一个非常强大的概念,一旦我理解了它,它就为我打开了许多大门。这个想法是,如果您将 numpy 与两个数组结合使用,它会逐个元素地执行简单的操作(+、-、*、/ 等)。这意味着,您当然必须具有相同的形状(每个维度中的元素数量相同)。例如 A.shape == (3,4) 和 B.shape == (3,4) 你可以做 A*B 并获得相同形状的新数组,其中每个元素都是 A 和B 在相同的索引。

a = ones((3,4))*2
b = ones((3,4))*3
c = a*b
print c.shape
> (3,4)

根据该规则,有一个聪明的例外:只要数组在某个维度中只有一个元素,那么它就会被广播。这意味着这一维度将沿着该轴“放大”,并具有与其他阵列兼容所需的相同副本。

a = ones((3,4))*2
b = ones((1,4))*3
c = a*b
print c.shape
> (3,4)

好的,对于您的问题,您可以通过在数组中添加维度来使用它: 所以你有 a.shape = (2,) 你想得到 (2,1) 和 b.shape = (3,) 你想要 (1,3) 这样你就对它们使用了一个操作,它将被广播,所以 a 中的每个元素都将与 b 中的每个元素相乘。您可以通过将 np.newaxis 添加到数组中来做到这一点

a = np.array((2,3))[:,np.newaxis]
b = np.array((5,6,7))[np.newaxis,:]
print a.shape 
> (2,1)
print b.shape
> (1,3)
c = a*b
> (2,3)

现在你会得到一个形状为 (2,3) 的数组,但你想要一个一维数组,所以你可以使用 flatten() 总结一下:

a = np.array((2,3))[:,np.newaxis]
b = np.array((5,6,7))[np.newaxis,:]
c = (a[:,np.newaxis]*b[np.newaxis,:]).flatten()

【讨论】:

    【解决方案3】:

    我想知道为什么你认为t1*t2 会产生你想要的东西?

    如果我写了:

    [x,y,z]*[a,b]
    

    你会说答案是什么?为什么?

    一些可能性:

    [x*a, y*b, z*??]
    [x*???, y*a, z*b]
    [[x*a, y*a, z*a],[x*b,y*b,z*b]]
    [[x*a, x*b],[y*a, y*b],[z*a,z*b]]
    [x*a, y*a, z*a, x*b, y*b, z*b]
    etc
    

    混合和匹配 2 个数字列表的多种方式。简而言之,numpy 尝试第一次逐个元素匹配,然后抱怨,因为它不知道如何处理不匹配的 z

    这是另一种生产“扁平”外部产品的方法:

    (t1.reshape(2,1)*t2).reshape(6)
    

    在 Python shell 中,分段尝试这个(和其他建议)以更好地了解发生了什么。

    在最终的reshape 之前,这会产生一个二维矩阵。这是了解如何组合这 2 个向量的关键。

    array([[10, 12, 14],
           [15, 18, 21]])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多