将列表中的浮点数近似为标量整数时引发错误

2024-10-02 14:28:08 发布

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

我试图将列表中的浮点数近似为标量整数值。也就是说,我试图将小于0.5的值转换为0,并且将大于或等于0.5的值转换为1。但是我得到了一个错误

我的列表的值如下所示:

0.2943,
0.3483,
0.3359,
0.3671,
0.6788,
1,
0.779

预期产出:

0,
0,
0,
0,
1,
1,
1

编写的代码:

listSample = []
listSample = list(y_predAN_PCA)

for i in listSample:
    if listSample[i] < 0.5:
        listSample[i] = 0
    else:
        listSample[i] = 1

但我得到了以下错误:

类型错误:只有整数标量数组可以转换为标量索引


Tags: 代码in类型列表forif错误整数
3条回答

你已经得到了别人的答案。如果使用第三方库没有问题,可以使用NumPy阵列的掩蔽。对于这样一个小的例子来说,这是一种过分的做法,但知道选择还是很好的

说明:lst<0.5返回值小于0.5的数组索引。然后将其作为索引传递给数组lst作为lst[lst<0.5],并重新分配这些值0。类似地,检查大于等于0.5的值并将其重新指定为1

import numpy as np
lst = np.array([0.2943,0.3483,0.3359,0.3671,0.6788,1,0.779])
lst[lst<0.5] = 0
lst[lst>=0.5] = 1
print (lst)
# array([0., 0., 0., 0., 1., 1., 1.])

Jon Clements所建议的另一种更好的方法是使用np.where。在这里,首先指定条件(lst<0.5在这里)。如果条件为True,则该条件后的第一个值将分配给数组元素。如果条件为False,则将分配第二个值

np.where(lst<0.5, 0, 1)
# array([0., 0., 0., 0., 1., 1., 1.])

您正在迭代项而不是项索引;使用enumerate获取以下两种:

listSample = list(y_predAN_PCA)

for i,s in enumerate(listSample):
    if s < 0.5:
        listSample[i] = 0
    else:
        listSample[i] = 1

更好的方法是使用round和列表理解:

listSample = [round(e) for e in listSample]

或者,如果您正在使用NumPy:

listSample = np.round(listSample)

注意:这将使0.5向下取整为0(“银行家取整”),并返回浮动列表。更接近您的代码(对于正数)的是:

listSample = [int(e+0.5) for e in listSample]

您在代码片段中错误地使用了for循环。在您的代码中,i引用了列表中的第i个值,而不是第i个索引。下面的代码可能会有所帮助

range函数将根据列表的长度生成索引

for i in range(len(listSample)):
    if listSample[i] < 0.5:
        listSample[i] = 0
    else:
        listSample[i] = 1

相关问题 更多 >