Python错误索引器错误:仅限整数

2024-04-24 03:04:18 发布

您现在位置:Python中文网/ 问答频道 /正文

执行代码时出现以下错误: 如果(abs(arr[i]-val)<;float(temp)): 索引器错误:只有整数、切片(:)、省略号(...),新轴(None)和整数或布尔数组是有效的索引

编码

def closestval(arr, val):
temp = abs(arr[0] - val)
pos = 0
for i in arr:
    if abs(arr[i] - val) < temp:
        temp = abs(arr[i] - val)
        pos = i
return pos;

我正在传递由创建的列表np.linspace公司,值为2*np.pi/2号文件在

编码

^{pr2}$

Tags: 代码posltnone编码错误np切片
1条回答
网友
1楼 · 发布于 2024-04-24 03:04:18

在python中,当你在某物上迭代时,你从某物中得到元素。你不能得到索引(至少不是自动的)

In [262]: for i in ['a','b','c']:
     ...:     print(i)
     ...:     
a
b
c

In [264]: for i in np.arange(10,20,2):print(i)
10
12
14
16
18
In [265]: for i in range(4):print(i)
0
1
2
3

最后一个表达式有效地在列表[0,1,2,3]上迭代。在

所以这个表达式:

^{pr2}$

没有道理。i是{}的元素,不是索引。在

这应该是有效的:

for a in arr:
    if abs(a - val) < temp:
        temp = abs(a - val)
        #pos = i

但是,由于您需要索引i,首选的python迭代是:

for i, a in enumerate(arr):
    av = abs(a - val)
    if av < temp:
        temp = av
        pos = i

其中enumerate添加一个索引。把这个放在手边。在


但是这是numpy,我们不需要迭代(至少在Python中没有显式地迭代)

In [266]: x = np.linspace(0, 2*np.pi, 50, endpoint=True)
In [267]: x<(2*np.pi/2)
Out[267]: 
array([ True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False], dtype=bool)
In [268]: np.where(x<(2*np.pi/2))
Out[268]: 
(array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
        17, 18, 19, 20, 21, 22, 23, 24], dtype=int32),)
In [269]: x[24:26]
Out[269]: array([ 3.07747852,  3.20570679])

我们可以用一个语句将x的每个元素与目标进行比较,找出最大的。在

In [272]: np.max(np.where(x<(2*np.pi/2)))
Out[272]: 24

In [273]: np.argmin(x<(2*np.pi/2))
Out[273]: 25

有多种方法可以确定<测试的最后一个元素是真的,或者它在哪里切换为False。在

相关问题 更多 >