代码之家  ›  专栏  ›  技术社区  ›  jmbarrios

numpy searchsorted有什么问题吗?

  •  1
  • jmbarrios  · 技术社区  · 9 年前

    这在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的顺序就会保持不变。

    1 回复  |  直到 9 年前
        1
  •  1
  •   ali_m    9 年前

    np.searchsorted 尚不支持屏蔽数组( see here 有关受支持方法的列表)。

    您可以通过手动索引来获得预期结果 a 与之相反 a.mask ,然后将结果作为第一个参数传递给 np.搜索排序 :

    c = np.searchsorted(a[~a.mask], b)
    
    # or alternatively, a[~a.mask].searchsorted(b)
    
    print(np.allclose(c, expected))
    # True