我正在尝试完成以下功能,但我遇到了索引问题,导致“ValueError:操作数无法与形状(0,9)(5)一起广播”。
我认为我的错误可能来自于我是如何调用ssd_difference []中的值的,但我并不完全确定。
另外,我将如何根据下面给出的提示使用convolve2d?我知道numpy有它的功能,但我不知道我需要投入什么来使它工作。
附加信息:binomialFilter5()返回表示二项式过滤器的5x1 numpy数组dtype float。我还假设“weights []”是ssd_difference []值。
month amt CalcAmt
JAN 10000 0
FEB 20000 2
MAR 30000 1.5
APR 40000 1.33
“”“计算帧之间的转换成本,将动态变为 帐户。
说明:
1.通过ssd差异的行和列迭代,忽略了
前两个值和后两个值。
1A。对于i,j处的每个值,乘以长度的二项式滤波器
五个(在代码后面实现)由权重开始两个
帧之前直到两帧之后,并取这些帧的总和
产品
def transitionDifference(ssd_difference):
乘以每个i,j的二项式滤波器权重得到 你的输出。
要了解我们的原因,可能需要一点点了解 计算这个,简单的解释是改变 第4帧到第5帧,让我们调用这个ch(4,5),然后我们做这个权重:
ch(4,5)= ch(2,3)+ ch(3,4)+ ch(4,5)+ ch(5,6)+ ch(6,7)
这说明了之前更改和未来的权重 考虑当前帧时的变化。
当然,我们用二项式滤波器来衡量所有这些和,所以 重量ch(4,5)仍然是最重要的一个,但是 希望能让你更好地理解。
i.e. Your weights for frame i are:
[weight[i - 2, j - 2],
weight[i - 1, j - 1],
weight[i, j],
weight[i + 1, j + 1],
weight[i + 2, j + 2]]
答案 0 :(得分:1)
正如我评论的那样,你真的应该告诉我们产生错误信息的那一行。
但我可以猜测,因为只有几行执行涉及广播的操作。最有可能的是:
output[i,j] = np.sum( ssd_difference[i-2:i+2]*binomialFilter5())
您写道binomialFilter5()
生成(5,1)
数组,但错误是关于(5,)
。这可能没关系,但你真的应该保持尺寸的数量。有时(5,1)
与(5,)
显着不同。
output
的形状为(ssd_difference.shape[0] - 4, ssd_difference.shape[1] - 4)
。但是你在i,j
上迭代range(len(ssd_difference))
。 output[i,j]
最终会产生index error
。特别是在迭代2d数组时,最好使用正确的shape
元素,而不是len()
。
但我怀疑ssd_difference[i-2:i+2]
会立即产生错误。在i==0
时,这是ssd_difference[-2:2]
。这产生了(0,9)
数组,因为-2
索引意味着距离最后一个,大于2
。
我认为你打算从这个数组中拉出5行,以匹配另一个数组中的5个值。一个正确的迭代,我认为是:
for i in range(output.shape[0]):
for j in range(output.shape[1]):
....
output[i,j] = np.sum(ssd_difference[i:i+5, :] * binomialFilter5())
...
您应该在交互式shell中单独测试这样的表达式,并选择值i
。 ssd_difference[i:i+5, :]
的形状应为(5,9)
,binomialFilter5()
应为(5,1)
。