Kin*_*chy 5 python arrays tuples numpy
我有一个返回元组的函数,我需要检查元组中是否存在特定元素。我不知道元组中的元素类型,但我知道我想要完全匹配。例如,我想要
1 in (1, [0, 6], 0) --> True
1 in ([1], 0, 6]) --> False
Run Code Online (Sandbox Code Playgroud)
这应该非常简单,对吧?我只是检查一下1 in tuple_output_from_function。
如果元组中有一个 numpy 数组作为元素,则会中断
import numpy as np
s = tuple((2, [0, 6], 1))
4 in s --> False
t = tuple((2, np.arrary([0, 6]), 1))
4 in t --> ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Run Code Online (Sandbox Code Playgroud)
我预计第二种情况会返回 False,因为 4 不在元组中。即使它在数组中,我仍然期望 False。我可以做到0 in t[1]没有错误。为什么会出现这种情况,以及如何在不假设存在 numpy 数组或必须显式检查它的情况下使我的检查对其稳健?
它会崩溃,因为如果你in进行运算符,Python 在底层使用的是等于运算符 ( ==)。
考虑一下:
t = (2, np.array([0, 6]), 1)
v = 1
print(v in t)
Run Code Online (Sandbox Code Playgroud)
Python 检查元组中的每个值t是否相等。对于 numpy 数组,操作1 == np.array([0, 6])是另一个布尔数组[False False]。然后 Python 检查这个结果是否为真,这会抛出您看到的异常。
您可以使用any()并检查您检查的当前值是否是该值的类型int:
t = (2, np.array([0, 6]), 1)
v = 1
x = any(v == i for i in t if isinstance(i, int))
print(x)
Run Code Online (Sandbox Code Playgroud)
印刷:
True
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
60 次 |
| 最近记录: |