1

我试图沿一个轴边缘化一个数组,并检查一维峰值是否出现在与原始二维峰值相同的相关索引处。以下断言在什么情况下(形式x)会失败?

def check(x,axis=None):
    import numpy
    m = numpy.sum(x, axis=axis)
    v,w = numpy.unravel_index(numpy.argmax(x), x.shape)
    assert(v==numpy.argmax(m))
    return

对于x=numpy.array(range(15)).reshape(5,3),check(x,axis=0)会引发错误,但check(x,axis=1)不会。我不明白为什么 anAssertionError会被提出 - 我是不是很愚蠢?

4

2 回答 2

1

您正在检查未分解索引的错误坐标。代替

v,w=numpy.unravel_index(numpy.argmax(x),x.shape)
assert(v==numpy.argmax(m))

你可能想要

vw = numpy.unravel_index(numpy.argmax(x),x.shape)
assert vw[1 - axis] == numpy.argmax(m)

也许

v,w=numpy.unravel_index(numpy.argmax(x),x.shape)
assert (v if axis == 1 else w) == numpy.argmax(m)
于 2012-08-29T13:13:19.210 回答
1

你的axis论点的价值是至关重要的。

带数组,x会给你(N, M)m=np.sum(x, axis=axis)

  • 一个标量 if axis=None;
  • 一个M数组 if axis=0;
  • 一个N数组 if axis=1

因此,您np.argmax(m)将始终为 0 if ,或者和(resp. ) if (resp. )axis=None之间的整数。0MNaxis=0axis=1

但是,您(v, w) = np.unravel_index(...)将始终将您v作为 0 和 之间的整数给出N

如您所见,对于axis=0,潜在值的范围m与 for 不同v,而对于axis=1

因此,mvifaxis=1wif进行比较axis=0(@ecatmur 的回答向您展示了如何)。

于 2012-08-29T13:34:52.807 回答