不明白这个IndexError

时间:2018-02-05 02:02:11

标签: python numpy

我尝试运行此代码

import numpy as np 
X=[]
j=0
a=np.array([1,-8,-9,2,5,8,7,1,-5,-5,1])
S=np.array([4,8,9,8,9,55,6,62,23,2,-2])
index=np.array(np.where(a>0))
for j in range (0,np.size(index)):
    X.append( S[index[j]] )
print(X) 

但是我得到IndexError并且我不明白为什么。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

您使用数组中的元素" index"决定从S数组中取出哪个元素

S[index[j]]

您要拉的值(索引[j]的值)指向不在S中的位置。

我怀疑你的问题是np.where操作返回a的索引,其中条件为真,所以你得到的值是10,这是一个超过S的最后一个索引的.10是S的长度。

答案 1 :(得分:0)

In [111]: j=0
In [112]: a=np.array([1,-8,-9,2,5,8,7,1,-5,-5,1])
     ...: S=np.array([4,8,9,8,9,55,6,62,23,2,-2])
     ...: 
In [113]: index=np.array(np.where(a>0))
In [114]: index
Out[114]: array([[ 0,  3,  4,  5,  6,  7, 10]], dtype=int32)
In [115]: _.shape
Out[115]: (1, 7)  

通过将where包裹在np.array中,您创建了一个(1,7)数组。这是故意的吗?你了解后果吗?

In [116]: np.size(index)
Out[116]: 7

大小给出了元素的总数。通常我们使用shape

j=0确定时的索引:

In [117]: index[0]
Out[117]: array([ 0,  3,  4,  5,  6,  7, 10], dtype=int32)

除非我们选择了多个值 - (1,7)数组的第一行。

j提升为1,我们得到索引错误:

In [118]: index[1]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-118-f6a00d4fbf8f> in <module>()
----> 1 index[1]

IndexError: index 1 is out of bounds for axis 0 with size 1

试图选择第二行。

请注意整个索引错误消息 - 索引,大小,轴。所有这些信息都是相关的,应该包含在您的错误消息中。

回到where。这会产生1个元组的大小(1 dim),其中包含7个元素的数组。

In [124]: index = np.where(a>0)
In [125]: index
Out[125]: (array([ 0,  3,  4,  5,  6,  7, 10], dtype=int32),)

该元组可以直接用于索引。例如,a的正值为:

In [126]: a[index]
Out[126]: array([1, 2, 5, 8, 7, 1, 1])

由于S具有相同的形状,因此相应的元素为:

In [127]: S[index]
Out[127]: array([ 4,  8,  9, 55,  6, 62, -2])

无需循环。

所以

  • 注意整个错误消息
  • 打印问题值
  • 确保您了解索引
  • 查看where等函数的文档。