通过分配术语将Numpy数组相乘

时间:2014-04-06 13:54:29

标签: python arrays numpy matrix multiplication

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

' TEST1&#39 =(2,3)

' TEST2&#39 =(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)

一起广播

我该怎样做才能获得理想的结果?

3 个答案:

答案 0 :(得分:4)

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

编辑:

Subraction:我们无法使用numpy.outer,但我们可以使用numpy.newaxis

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

答案 1 :(得分:1)

您可以使用广播功能。这是一个非常强大的概念,一旦我了解它,就会给我打开许多门。我们的想法是,如果你将它与两个数组结合使用,numpy会逐个元素地执行简单的操作(+, - ,*,/等)。这意味着,当然你必须具有相同的形状(每个维度中相同数量的元素)。例如A.shape ==(3,4)和B.shape ==(3,4)你可以做A * B并获得相同形状的新数组,其中每个元素是A和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),但你想要一个1d数组,所以你可以使用flatten() 总结一下:

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

答案 2 :(得分:1)

我想知道为什么你认为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之前,这会生成一个2D矩阵。这是了解如何组合2个向量的关键。

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