Python 我拿numpy做什么不对?
这在numpy是一种很有趣的行为。以下测试失败:Python 我拿numpy做什么不对?,python,numpy,binary-search,masked-array,Python,Numpy,Binary Search,Masked Array,这在numpy是一种很有趣的行为。以下测试失败: 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],
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.mask
的倒数对a
进行手动索引,然后将结果作为第一个参数传递给np.searchsorted
,可以获得预期的结果:
c = np.searchsorted(a[~a.mask], b)
# or alternatively, a[~a.mask].searchsorted(b)
print(np.allclose(c, expected))
# True
第一个输入
a
由于结尾处的0
而未排序,因此您可能必须将附加输入argsorter
与np一起使用。searchsorted
@Divakar排序是因为它是一个屏蔽数组,所以屏蔽值是最后一个,并且numpy
定义此顺序。如果在<代码> <代码> <代码> >中使用<代码> ARGREST/代码>方法,它会给您索引为有序序列HMM,是的,在第二种情况下,我没有考虑.NUBY支持,使用<代码> AA/COD> >代码> BB< /C> >和<代码> cc>代码>,我得到了预期的结果,但问题是在第一种情况下。我最初使用了错误的测试用例。.searchsorted
方法只是继承自numpy.ndarray
——它“不受支持”,因为它忽略了掩码。