【发布时间】:2014-05-17 13:01:31
【问题描述】:
当我尝试使用 Python (Numpy) 解决科学问题时,出现“形状不匹配”错误:“形状不匹配:对象无法广播到单个形状”。我设法以更简单的形式重现了相同的错误,如下所示:
import numpy as np
nx = 3; ny = 5
ff = np.ones([nx,ny,7])
def test(x, y):
z = 0.0
for i in range(7):
z = z + ff[x,y,i]
return z
print test(np.arange(nx),np.arange(ny))
当我尝试用x=1,y=np.arange(ny) 调用test(x,y) 时,一切正常。那么这里发生了什么?为什么两个参数都不能是numpy数组?
更新
我已经通过@Saullo Castro 的一些提示解决了这个问题。以下是一些更新信息,供那些试图提供帮助但不清楚我的意图的人:
基本上,我创建了一个尺寸为 nx*ny 的网格和另一个数组 ff,它为每个节点存储了一些值。在上面的代码中,ff 每个节点有 7 个值,我试图将这 7 个值相加得到一个新的 nx*ny 数组。
但是,“形状不匹配”错误并不是由于求和过程造成的,因为你们中的许多人现在可能已经猜到了。我误解了将 ndarray 对象作为输入参数的函数的规则。我试图将np.arange(nx), np.arange(ny) 传递给test() 不会给我我想要的,即使nx==ny。
回到我的初衷,我通过创建另一个函数来解决问题,并使用np.fromfunction创建了数组:
def tt(x, y):
return np.fromfunction(lambda a,b: test(a,b), (x, y))
这并不完美,但它确实有效。 (在这个例子中似乎不需要创建一个新函数,但是在我的实际代码中我稍微修改了它,以便它可以用于网格切片)
无论如何,与我这种肮脏的解决方案相比,我确实相信有更好的方法。因此,如果您对此有任何想法,请与我们分享:)。
【问题讨论】:
-
我认为您误解了索引多维数组的工作原理,请查看文档;解释得很清楚docs.scipy.org/doc/numpy/user/basics.indexing.html
-
@Akavall 你能更具体一点吗?顺便说一句,我知道我正在混合使用
x[i]和i,因为在这个简化的情况下它们是相同的。