"index 0 is out of bounds for axis 0 with size 0" 的意思是什么?

47
我对Python和NumPy都不熟悉。我运行了自己编写的代码,出现了以下提示信息:"索引0超出了大小为0的轴0的范围"。没有上下文,我只想知道这是什么意思...这可能很傻,但是轴0和大小0是什么意思?索引0表示数组中的第一个值...但我无法弄清楚轴0和大小0是什么意思。
"data" 是一个带有许多数字的文本文件,其中有两列。
x = np.linspace(1735.0,1775.0,100)
column1 = (data[0,0:-1]+data[0,1:])/2.0
column2 = data[1,1:]
x_column1 = np.zeros(x.size+2)
x_column1[1:-1] = x
x_column1[0] = x[0]+x[0]-x[1]
x_column1[-1] = x[-1]+x[-1]-x[-2]
experiment = np.zeros_like(x)
for i in range(np.size(x_edges)-2):
    indexes = np.flatnonzero(np.logical_and((column1>=x_column1[i]),(column1<x_column1[i+1])))
    temp_column2 = column2[indexes]
    temp_column2[0] -= column2[indexes[0]]*(x_column1[i]-column1[indexes[0]-1])/(column1[indexes[0]]-column1[indexes[0]-1])
    temp_column2[-1] -= column2[indexes[-1]]*(column1[indexes[-1]+1]-x_column1[i+1])/(column1[indexes[-1]+1]-column1[indexes[-1]])
    experiment[i] = np.sum(temp_column2)   
return experiment

1
这可能与此有关。https://dev59.com/6ojca4cB1Zd3GeqP4v_r - z0rberg's
4个回答

53
numpy 中,索引和维度编号从0开始。因此,axis 0 表示第1个维度。此外,在 numpy 中,一个维度的长度(大小)可以为0。最简单的情况是:
In [435]: x = np.zeros((0,), int)
In [436]: x
Out[436]: array([], dtype=int32)
In [437]: x[0]
...
IndexError: index 0 is out of bounds for axis 0 with size 0

如果x = np.zeros((0,5), int),那我也会得到这个错误。这是一个有0行和5列的二维数组。

因此,在您的代码中某个地方,您正在创建一个第一轴大小为0的数组。

在询问错误时,我们期望您告诉我们出现错误的位置。

此外,在调试此类问题时,您应该首先打印怀疑变量的shape(以及可能的dtype)。

应用于pandas

解决错误:

  1. 使用try-except
  2. 验证数组的大小不为0
    • if x.size != 0:

10
实质上,它意味着您没有正在尝试引用的索引。例如:
df = pd.DataFrame()
df['this']=np.nan
df['my']=np.nan
df['data']=np.nan
df['data'][0]=5 #I haven't yet assigned how long df[data] should be!
print(df)

如果我没有告诉Pandas我的数据框有多长,那么执行代码会出现你所提到的错误。但是,如果我对数据框进行了索引并指定了长度,那么就不会出现错误:

df = pd.DataFrame(index=[0,1,2,3,4])
df['this']=np.nan
df['is']=np.nan
df['my']=np.nan
df['data']=np.nan
df['data'][0]=5 #since I've properly labelled my index, I don't run into this problem!
print(df)

希望这回答了你的问题!

10

这是Python中的IndexError,意味着我们试图访问张量中不存在的索引。下面是一个非常简单的例子,以便更好地理解这个错误。

# create an empty array of dimension `0`
In [14]: arr = np.array([], dtype=np.int64) 

# check its shape      
In [15]: arr.shape  
Out[15]: (0,)

有了这个数组 arr,现在如果我们尝试将任何值分配给某个索引,例如像下面的例子中的索引0

In [16]: arr[0] = 23     

接着,我们会得到一个IndexError,如下所示:

IndexError                                Traceback (most recent call last)
<ipython-input-16-0891244a3c59> in <module>
----> 1 arr[0] = 23

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

这是因为我们试图访问一个索引(在第0个位置),但实际上它不存在(即数组大小为0,没有任何元素)。

In [19]: arr.size * arr.itemsize  
Out[19]: 0

因此,这样的数组是无用的,不能用于存储任何东西。因此,在你的代码中,你需要跟踪回溯并查找创建大小为0的数组/张量的位置,并进行修复。

0
我遇到了这个错误,并发现是我的数据类型导致了错误。该类型是一个对象,在将其转换为int或float后,问题得到解决。
我使用了以下代码:
df = df.astype({"column": new_data_type,
                "example": float})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接