【发布时间】:2016-04-28 02:07:34
【问题描述】:
在 numpy.searchsorted 中这是一种有趣的行为。以下测试失败:
import numpy as np
a = np.ma.masked_array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
31, 32, 33, 0],
mask=[False, False, False, False, False, False, False,
False, False, False, False, False, False, False,
False, False, False, False, False, False, False,
False, False, False, False, False, False, False,
False, False, False, False, False, True],
fill_value=0, dtype='uint8')
b = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 33],
dtype='uint8')
expected = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
28, 29, 32])
c = a.searchsorted(b)
np.testing.assert_array_equal(c, expected)
c 数组中的最后一项是 34,我不知道为什么。
但类似的,它通过了:
aa = np.ma.masked_array([1, 2, 3, 4, 0],
mask=[False, False, False, False, True],
fill_value=0, dtype='uint8')
bb = np.array([1, 3, 4], dtype='uint8')
expectedd = np.array([0, 2, 3])
cc = aa.searchsorted(bb)
np.testing.assert_array_equal(cc, expectedd)
在numpy.array.searchsorted 文档上,它的描述说:
找到排序数组 a 中的索引,这样,如果 v 中的相应元素插入到索引之前,则 a 的顺序将被保留。
【问题讨论】:
-
第一个输入
a未排序,因为末尾有zero,因此您可能必须将附加输入 argsorter与np.searchsorted一起使用。 -
@Divakar 它是排序的,因为它是一个掩码数组,所以掩码值是最后一个,
numpy定义了这个顺序。如果您在a上使用argsort方法,它会将索引作为有序序列提供给您 -
嗯,是的,我没有考虑过。
标签: python numpy binary-search masked-array