我有2个Numpy数组,长度为107952899。
a = []
b = []
我想在数组a
中找到大于20的索引。我将结果存储在变量c
中:
c = np.where(a > 20)
然后通过使用c
(存储索引),我想在numpy数组b
中找到对应于相应索引的值。我将其存储在d
中:
d = b[c]
然后,我希望n
中的前d
个最大元素具有实际索引。利用这些索引,我将进行进一步的计算。
d.argsort([-N])[::-1]
我尝试使用argsort
,但出现以下错误:
IndexError: Invalid index to scalar value
因此,总而言之,我有2个numpy数组。在第一个数组中,我必须过滤大于20的值。然后,我必须使用第一个数组的过滤索引在第二个数组中找到相应的值。之后,我必须按降序对第二个数组进行排序,并获取这些索引以进行进一步的计算。
我通过在Pandas DataFrame中引入这些数组来尝试了上述方法,虽然它可以正常工作,但我更愿意直接这样做。
什么是最好的方法?
答案 0 :(得分:1)
尝试使用以下类似内容:
首先将数组d转换为numpy数组(如果还不是一个)
d_arr = np.asarray(d)
然后,您可以使用 numpy.argpartition 方法来获取n个最大值的索引
idx = np.argpartition(d_arr, -N)[-N:]
获取数组中N个最大元素的索引。然后,您可以
d_arr[idx]
返回那些元素是什么。
我用来确认此方法有效的测试:
a = np.array([1,2,4,6,7,8,9,9,9,7,4])
idx = np.argpartition(a, -5)[-5:]
print(idx)
[4 5 8 7 6]
print(a[idx])
[7 8 9 9 9]
对于较大的数组,我将根据比较测试 {{3],在 numpy.argpartition 上坚持使用 numpy.argsort 方法}} ,因为它显示 here 的速度是 numpy.argpartition 的两倍。