"slice indices must be integers"拆分数据数组时出错

"slice indices must be integers" error when splitting a data array

你能帮我解决这个问题吗? x 已经是一个整数。但是我遇到了这个问题,如果我使用 90 而不是 x,代码运行但 x 变量不起作用。

split_ratio=[3,1,1]
x=split_ratio[0]/sum(split_ratio)*data.shape[0]
print(x)
print(data[0:x,:])

输出;

90.0
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-38-0e56a1aca0a0> in <module>()
      2 x=split_ratio[0]/sum(split_ratio)*data.shape[0]
      3 print(x)
----> 4 print(data[0:x,:])

TypeError: slice indices must be integers or None or have an __index__ method

从输出中可以看出该数字是浮点数(90.0)而不是整数(90)。只需转换为 int 就像 -

x=int(split_ratio[0]/sum(split_ratio)*data.shape[0])

无论何时除以 /,它总是 returns float 而不是 integer,尽管答案可能是一个整数(小数点后没有任何内容)。
要解决这个问题,有两种方法,一种是使用int()函数,另一种是使用floor division //.

所以,你可以做

x=int(split_ratio[0]/sum(split_ratio)*data.shape[0])

x=split_ratio[0]//sum(split_ratio)*data.shape[0]

现在,当您执行 print(x) 时,输出将是 90 而不是 90.0,因为 90.0 意味着它是一个浮点数,而 90意味着现在它是一个整数。

在拼接字符串和列表等可迭代对象时,不能使用浮点数。 以下面的代码为例,不该做什么


例子

data = 'hello there'
#bad is a float since 4/3 1.333
bad = 4/3
#here bad is used as the end (`indexing[start:end:step]`). 
indexIt = data[0:bad:1]

因为在应该是整数的地方使用了浮点数

结果

TypeError: slice indices must be integers or None or have an index method


解决此问题的方法是将 bad 的值包围在 int() 中,这应该转换 1.333 to 1(浮点数到整数)

解决方案

data = 'hello there'
bad = int(4/3)
indexIt = data[0:bad:1]
print(indexIt)

结果

"h"

考虑到这一点,您的代码应该类似于

split_ratio=[3,1,1]
x=split_ratio[0]/sum(split_ratio)*data.shape[0]
print(x)
print(data[0:x:])

#注意:索引时x后面的逗号要去掉