在数组上执行argsort操作时出现IndexError

时间:2019-02-07 18:45:24

标签: python python-3.x pandas numpy index-error

我有2个Numpy数组,长度为107952899。

  1. a = []
  2. 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中引入这些数组来尝试了上述方法,虽然它可以正常工作,但我更愿意直接这样做。

什么是最好的方法?

1 个答案:

答案 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 的两倍。