我有以下情况我希望将两个数组元素相乘,其中一个数组将数组作为元素:
>>> import numpy as np
>>> base = np.array( [100., 111.,] )
>>> c = np.array( [9., 11.] )
>>> n0 = np.zeros(len(base))
>>> nn = 3 + n0 # This is the gist of a bunch of intermediate operations
>>> grid = [np.ones(i) for i in nn]
>>> base
array([ 100., 111.])
>>> c
array([ 9., 11.])
>>> nn
array([ 3., 3.])
>>> grid
[array([ 1., 1., 1.]), array([ 1., 1., 1.])]
到目前为止一切看起来都不错。 grid
似乎有两个元素,每个元素长三个元素。我觉得我应该能够将它与c
>>> a = grid * c
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (2,3) (2)
这不像我希望的那样。错误是有希望的。我可以做一些换位技巧并得到我的结果:
a =(grid.T * c).T Traceback(最近一次调用最后一次): 文件“”,第1行,in AttributeError:'list'对象没有属性'T'
这比我预期的更令人沮丧。我以为我正在使用数组,但我知道我现在有一个列表。我试着用一些老式的蛮力:
>>> grid_mod = np.array( [np.ones(3), np.ones(3) ] )
>>> grid_mod
array([[ 1., 1., 1.],
[ 1., 1., 1.]])
>>> grid_mod * c
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (2,3) (2)
我确信这会奏效!我注意到在我的最后一个元素之后有一个无关的空格,所以我删除了它:
>>> grid_mod2 = np.array( [np.ones(3), np.ones(7)] )
>>> grid_mod2
array([array([ 1., 1., 1.]), array([ 1., 1., 1., 1., 1., 1., 1.])], dtype=object)
>>> grid_mod2 * c
array([array([ 9., 9., 9.]),
array([ 11., 11., 11., 11., 11., 11., 11.])], dtype=object)
最后一个按预期工作。
我的问题是:
grid
,以便结果是数组而不是数组列表。答案 0 :(得分:2)
这两段代码产生不同的东西,虽然空间没有影响:
>>> np.array([np.ones(3), np.ones(3)])
array([[ 1., 1., 1.],
[ 1., 1., 1.]])
因为列表中的两个数组都具有相同的维度,所以将其转换为包含2行和3列的单个数组。
>>> np.array([np.ones(3), np.ones(7)])
array([array([ 1., 1., 1.]), array([ 1., 1., 1., 1., 1., 1., 1.])], dtype=object)
在这种情况下,数组的长度不匹配,因此numpy创建一个1D数组,两个项目长,类型为object
,并且每个对象恰好是一个numpy数组。
当您将第一个与c
相乘时,您试图将形状(2, 3)
的数组与形状(2,)
的数组相乘,numpy不知道该怎么做。如果您将c
数组重新塑造为具有(2, 1)
形状,则可以得到您想要的结果,例如
>>> grid_mod * c[:, np.newaxis]
array([[ 9., 9., 9.],
[ 11., 11., 11.]])
当你将第二个与c
相乘时,你试图将两个形状(2,)
的数组相乘,所以numpy做了元素乘法而没有问题。并且由于数组中的每个项本身都是一个数组,当你尝试将它乘以标量时,numpy也知道如何去做。虽然这确实有效,但它比前一种方法慢很多,10000行数组大约100倍:
c = np.random.rand(10000)
a = np.random.rand(10000, 3)
b = np.empty((10000,), dtype=object)
for j in xrange(10000):
b[j] = a[j]
%timeit a*c[:, np.newaxis]
10000 loops, best of 3: 176 us per loop
%timeit b*c
10 loops, best of 3: 16.5 ms per loop