我在文件中有两个一维的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)
一起广播我该怎样做才能获得理想的结果?
答案 0 :(得分:4)
>>> 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]])