【发布时间】:2013-11-08 21:22:54
【问题描述】:
我有以下情况,我想将两个数组元素相乘,其中一个数组将数组作为元素:
>>> 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 回溯(最近一次通话最后): 文件“”,第 1 行,在 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以便结果是数组数组而不是数组列表。 - 这一切到底发生了什么?为什么数组末尾的多余空间会给我一个完全不同的结果。
- 有没有更 Pythonic 的方式来解决这个问题?
【问题讨论】:
-
尝试使用
grid=np.vstack(grid)并使用二维数组grid -
当我做乘法时,这仍然给我一个广播错误。