【问题标题】:What am I doing wrong with numpy searchsorted?我在使用 numpy searchsorted 时做错了什么?
【发布时间】: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,因此您可能必须将附加输入 arg sorternp.searchsorted 一起使用。
  • @Divakar 它是排序的,因为它是一个掩码数组,所以掩码值是最后一个,numpy 定义了这个顺序。如果您在a 上使用argsort 方法,它会将索引作为有序序列提供给您
  • 嗯,是的,我没有考虑过。

标签: python numpy binary-search masked-array


【解决方案1】:

np.searchsorted 尚不支持掩码数组(see here 获取支持的方法列表)。

您可以通过手动索引aa.mask 的倒数来获得预期的结果,然后将结果作为第一个参数传递给np.searchsorted

c = np.searchsorted(a[~a.mask], b)

# or alternatively, a[~a.mask].searchsorted(b)

print(np.allclose(c, expected))
# True

【讨论】:

  • numpy support searchsorted for Masked arrays 同样在第二种情况下,aabbcc,我得到了预期的结果,但问题在于第一种情况。
  • 对不起,我最初使用了错误的测试用例。 .searchsorted 方法只是从 numpy.ndarray 继承而来的——它“不支持”,因为它忽略了掩码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 2019-07-30
  • 2020-07-01
  • 2011-06-01
相关资源
最近更新 更多