含np数组元组的成员资格测试

2024-09-30 10:34:29 发布

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

我试图测试包含标量元组和np.array的列表/元组中的成员身份。它适用于正则数组,但不适用于np数组。下面的第一个print语句打印“True”,第二个语句引发ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

huge = [(5.0, [[ 3., -1.],
       [-1.,  2.]], [ 7.,  5.]), (2.0, [[ 2.,  1.],
       [ 1.,  1.]]), [-2.,  5.], (2.0, [[ 1.,  0.],
       [ 0.,  2.]], [ 0.,  1.]), (1.0,[[ 0.2,  0.1],
       [ 0.1,  1. ]], [-3.,  4.])]
lil = (2.0,[[ 1.,  0.],
       [ 0.,  2.]],[ 0.,  1.])

nphuge = [(5.0, np.array([[ 3., -1.],
       [-1.,  2.]]), np.array([ 7.,  5.])), (2.0, np.array([[ 2.,  1.],
       [ 1.,  1.]]), np.array([-2.,  5.])), (2.0, np.array([[ 1.,  0.],
       [ 0.,  2.]]), np.array([ 0.,  1.])), (1.0, np.array([[ 0.2,  0.1],
       [ 0.1,  1. ]]), np.array([-3.,  4.]))]
nplil = (2.0, np.array([[ 1.,  0.],
       [ 0.,  2.]]), np.array([ 0.,  1.]))


print lil in huge #Prints "True"

print nplil in nphuge #Raises ValueError

我可以通过手动将每个元组的成员转换为常规列表而不是np.array来解决这个问题:

nplil_work_around = nplil[0],nplil[1].tolist(),nplil[2].tolist()
nphuge_work_around = [(x[0],x[1].tolist(), x[2].tolist()) for x in nphuge]

print nplil_work_around in nphuge_work_around # prints True

有没有不转换np.array的方法


Tags: intrue列表np成员数组语句array
1条回答
网友
1楼 · 发布于 2024-09-30 10:34:29

您可以使用:

any( all((np.all(f==s) for f, s in zip(nplil, nphuge[i]))) for i in range(len(nphuge)) )

循序渐进:

>>> nphuge = [(5.0, np.array([[ 3., -1.],
       [-1.,  2.]]), np.array([ 7.,  5.])), (2.0, np.array([[ 2.,  1.],
       [ 1.,  1.]]), np.array([-2.,  5.])), (2.0, np.array([[ 1.,  0.],
       [ 0.,  2.]]), np.array([ 0.,  1.])), (1.0, np.array([[ 0.2,  0.1],
       [ 0.1,  1. ]]), np.array([-3.,  4.]))]
>>> nplil = (2.0, np.array([[ 1.,  0.],
       [ 0.,  2.]]), np.array([ 0.,  1.]))

In [54]: [np.all(f==s) for f, s in zip(nplil, nphuge[0])]
Out[54]: [False, False, False]

In [55]: [np.all(f==s) for f, s in zip(nplil, nphuge[1])]
Out[55]: [True, False, False]

In [56]: [np.all(f==s) for f, s in zip(nplil, nphuge[2])]
Out[56]: [True, True, True]

>>> [ all((np.all(f==s) for f, s in zip(nplil, nphuge[i]))) for i in range(len(nphuge)) ]
[False, False, True, False]
>>> any( [ all((np.all(f==s) for f, s in zip(nplil, nphuge[i]))) for i in range(len(nphuge)) ] )
True

相关问题 更多 >

    热门问题