如何解决需要在Python 3中的for循环内比较两个数组元素,并得到错误“数组的真值...”
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
将产生一个布尔数组,并按元素进行比较。
请注意,要实现这一点,a
,b
必须是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 举报,一经查实,本站将立刻删除。