如何检查 numpy 数组是否在 Python 序列内?
How to check if a numpy array is inside a Python sequence?
我想检查给定数组是否在常规 Python 序列(列表、元组等)内。例如,考虑以下代码:
import numpy as np
xs = np.array([1, 2, 3])
ys = np.array([4, 5, 6])
myseq = (xs, 1, True, ys, 'hello')
我希望使用 in
进行简单的成员资格检查会起作用,例如:
>>> xs in myseq
True
但是如果我试图查找的元素不在 myseq
的第一个位置,显然它会失败,例如:
>>> ys in myseq
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
那么如何执行此检查?
如果可能的话,我希望不必将 myseq
转换为 numpy 数组或任何其他类型的数据结构。
这可能不是最漂亮或最快速的解决方案,但我认为它可行:
import numpy as np
def array_in_tuple(array, tpl):
i = 0
while i < len(tpl):
if isinstance(tpl[i], np.ndarray) and np.array_equal(array, tpl[i]):
return True
i += 1
return False
xs = np.array([1, 2, 3])
ys = np.array([4, 5, 6])
myseq = (xs, 1, True, ys, 'hello')
print(array_in_tuple(xs, myseq), array_in_tuple(ys, myseq), array_in_tuple(np.array([7, 8, 9]), myseq))
您可以使用 any
进行适当的测试:
import numpy as np
xs = np.array([1, 2, 3])
ys = np.array([4, 5, 6])
zs = np.array([7, 8, 9])
myseq = (xs, 1, True, ys, 'hello')
def arr_in_seq(arr, seq):
tp=type(arr)
return any(isinstance(e, tp) and np.array_equiv(e, arr) for e in seq)
测试:
for x in (xs,ys,zs):
print(arr_in_seq(x,myseq))
True
True
False
我想检查给定数组是否在常规 Python 序列(列表、元组等)内。例如,考虑以下代码:
import numpy as np
xs = np.array([1, 2, 3])
ys = np.array([4, 5, 6])
myseq = (xs, 1, True, ys, 'hello')
我希望使用 in
进行简单的成员资格检查会起作用,例如:
>>> xs in myseq
True
但是如果我试图查找的元素不在 myseq
的第一个位置,显然它会失败,例如:
>>> ys in myseq
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
那么如何执行此检查?
如果可能的话,我希望不必将 myseq
转换为 numpy 数组或任何其他类型的数据结构。
这可能不是最漂亮或最快速的解决方案,但我认为它可行:
import numpy as np
def array_in_tuple(array, tpl):
i = 0
while i < len(tpl):
if isinstance(tpl[i], np.ndarray) and np.array_equal(array, tpl[i]):
return True
i += 1
return False
xs = np.array([1, 2, 3])
ys = np.array([4, 5, 6])
myseq = (xs, 1, True, ys, 'hello')
print(array_in_tuple(xs, myseq), array_in_tuple(ys, myseq), array_in_tuple(np.array([7, 8, 9]), myseq))
您可以使用 any
进行适当的测试:
import numpy as np
xs = np.array([1, 2, 3])
ys = np.array([4, 5, 6])
zs = np.array([7, 8, 9])
myseq = (xs, 1, True, ys, 'hello')
def arr_in_seq(arr, seq):
tp=type(arr)
return any(isinstance(e, tp) and np.array_equiv(e, arr) for e in seq)
测试:
for x in (xs,ys,zs):
print(arr_in_seq(x,myseq))
True
True
False