Python 搜索包含numpy.nan的数组

Python 搜索包含numpy.nan的数组,python,arrays,numpy,nan,Python,Arrays,Numpy,Nan,我想: index = numpy.searchsorted(array([ 1., 2., 3., nan, 4., 5.]), 4.2, side='left') 给我: index = 4 该值在数组中的3.9之前起作用,但在nan之后不起作用 有什么想法吗?您正在排序的数组没有排序,需要排序才能正常工作np.nan将在排序数组中最后出现: >>> np.sort([1., 2., 3., nan, 4., 5.]) array([ 1.,

我想:

index = numpy.searchsorted(array([  1.,   2.,   3.,  nan,   4.,   5.]), 4.2, side='left')
给我:

index = 4
该值在数组中的
3.9
之前起作用,但在
nan
之后不起作用


有什么想法吗?

您正在排序的数组没有排序,需要排序才能正常工作
np.nan
将在排序数组中最后出现:

>>> np.sort([1., 2., 3., nan, 4., 5.])
array([  1.,   2.,   3.,   4.,   5.,  nan])
要解决此问题,可以使用
sorter
关键字参数传入数组的已排序索引列表。您可以使用
np.argsort
查找以下内容:

>>> arg_sorted = np.argsort([1., 2., 3., nan, 4., 5.])
>>> np.searchsorted([1., 2., 3., nan, 4., 5.], 4.2, side='right', sorter=arg_sorted)
4                     
Edit:根据Jaime下面的评论,传递
sorter
参数将意味着函数返回排序数组中的位置(而不是未排序数组中的位置)。由于
side='left'
指定应返回第一个合适的索引,因此可以使用
np.searchsorted
使用以下方法更好地识别正确的索引:

>>> idx = np.searchsorted([1., 2., 3., nan, 4., 5.], 4.2, side='left')
>>> arg_sorted[idx]
4

我没有足够的声誉来添加评论,所以我会在回答中添加我的两分钱

我也遇到过类似的挑战,据我所知,这个问题可能与我的工作有问题

为了说明我的观点,我用一个额外的元素展开了讨论中的数组

a = np.array([1., 2., 3., np.nan, 4., 5., 6.])
并像前面一样调用argsort算法

arg_sorted = np.argsort(a)

此外,除了找到4.2之外,我还考虑了5.2。然后,建议解决方案的输出为

for x in [4.2, 5.2]:
    ind_tmp = np.searchsorted(a, x, side='left')
    ind = arg_sorted[ind_tmp]
    print('x={}, ind={}'.format(x, ind))

x=4.2, ind=4
x=5.2, ind=4
我相信更正确的答案是使用
sorter
参数找到的,如下所示

for x in [4.2, 5.2]:
    ind_tmp = np.searchsorted(a, x, side='left', sorter=arg_sorted)
    ind = arg_sorted[ind_tmp]
    print('x={}, ind={}'.format(x, ind))

x=4.2, ind=5
x=5.2, ind=6

在这种情况下,5.2位于4.2以上的索引1处,与原始答案相反,更符合我对正确解决方案的理解。

当使用
sorter
参数时,它返回排序数组中的位置,而不是未排序数组中的位置。如果您像OP那样使用了
side='left'
,您将得到
3
作为返回,这是正确的,但不是OP想要的。在这种情况下,唯一的问题是去除NaN,要获得正确的索引,您必须执行
arg_sorted[idx]
,其中
idx
是您调用
np.searchsorted
的返回。感谢您把事情弄清楚,Jaime。我显然写得太匆忙了,错过了很多细节!我已经编辑了你的评论,如果我的措辞仍然缺乏,我可以进一步编辑。