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。我显然写得太匆忙了,错过了很多细节!我已经编辑了你的评论,如果我的措辞仍然缺乏,我可以进一步编辑。