微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

需要在Python 3中的for循环内比较两个数组元素,并得到错误“数组的真值...”

如何解决需要在Python 3中的for循环内比较两个数组元素,并得到错误“数组的真值...”

我有一个以下形式的numpy数组:

y_sol = 
[[0. 0. 1.]
 [0. 0. 1.]
 [0. 0. 1.]
 ...
 [1. 0. 0.]
 [0. 1. 0.]
 [1. 0. 0.]]

我需要使用元组列表给出的相关性将其转换为分类字符串值:

transf_codes = [('Alert',[1.,0.,0.]),('Neutral',[0.,1.,('Urgent',1.])]   

请注意,这里我没有使用字典来避免复杂的搜索以值作为搜索输入的键。

无论如何,我已经尝试了以下代码来完成工作:

for i in np.arange(len(y_sol)-1): 
    for j in np.arange(3):
        if np.equal(transf_codes[j][1],y_sol[i].all()):  # <-error line 
            y_categ[i] = transf_codes[j][0] 

我收到错误消息“具有多个元素的数组的真值不明确。请使用a.any()或a.all()”

在上面的“ if”行中,更自然的形式>>> transf_codes[j][1] == y_sol[i]

在if语句中比较数组,列表等元素方式的严格性和最佳方法是什么?

非常感谢。

解决方法

每当numpy尝试将数组强制转换为布尔值时,就会发生错误。它不知道该怎么做,因此会引发该错误。

因此,当您进行if (a == b)之类的操作时,a,b为数组,则会出错。

但是,a == b将产生一个布尔数组,并按元素进行比较。 请注意,要实现这一点,ab必须是numpy数组。列表行为不同。

我们可以使用布尔数组的一种方法是使用np.all方法(我见过您使用过),但是使用的位置不合适。您目前在y_sol[i]上执行.all()。

所以下面的代码和输出是正确的。

import numpy as np
y_sol = np.array( \
[[0.,0.,1.],[0.,[1.,0.],1.,0.]])

transf_codes = [('Alert',0.]),('Neutral',('Urgent',1.])]

for i in np.arange(len(y_sol)-1):
    for j in np.arange(3):
        if (transf_codes[j][1] == y_sol[i]).all():  # <-error line
            print(f'y_sol[i]={y_sol[i]},transf_codes={transf_codes[j][0]}')

这将输出:

y_sol[i]=[0. 0. 1.],transf_codes=Urgent
y_sol[i]=[0. 0. 1.],transf_codes=Urgent
y_sol[i]=[1. 0. 0.],transf_codes=Alert
y_sol[i]=[0. 1. 0.],transf_codes=Neutral

请注意,在比较向量之后,我使用了.all()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。