Numpy 检查元素是否在数组中
Numpy Check if an element is in array
我有一个数组 c
,另一个数组 d
。如何检查 d[1]
ord[3]
ord[5]
ord[7]
是否在数组 c
?
中
c = np.array([[ 1, 1,0],
[ 1,-1,0],
[-1, 1,0],
[-1,-1,0]])
d = np.array([[2,2,2],
[1,1,0],
[2,8,8],
[6,8,8],
[2,2,2],
[4,9,0],
[2,2,2],
[3,2,2]])
我试过了 g = np.any(c == d[1,3,5,7])
,但是没用。在这种情况下,结果应该是 True
,因为 [1,1,0] 在数组 c
中。谁能帮帮我?
试试这个
# to check if a row in its entirety match a list,
# use all on axis=1 first, then check if any rows match using any
(c==[2,1,0]).all(1).any()
False
多次检查
# use bit-wise | (instead of or)
((c==[2,1,0]) | (c==[3,1,0]) | (c==[5,5,0])).all(1).any()
当您使用 numpy 时,请使用定义的函数 isin
:
https://numpy.org/doc/stable/reference/generated/numpy.isin.html
g = np.isin([ 2, 1,0],c)
编辑:正如@Phoenix 建议进行所有矢量检查,您需要在末尾添加所有 g = np.isin([ 2, 1,0],c).all()
this return False
。在协作中测试:
编辑:您更改了问题,但答案同样有效。这是检查 c 中所有 d 的方法:
将 numpy 导入为 np
c = np.array([[ 1, 1,0],
[ 1,-1,0],
[-1, 1,0],
[-1,-1,0]])
d = np.array([[2,2,2],
[1,1,0],
[2,8,8],
[6,8,8],
[2,2,2],
[4,9,0],
[2,2,2],
[3,2,2]])
for item in d:
g = np.isin(item,c).all()
print(g)
如果你想要 d 中的特定数组使用不带 for 的公式,只需输入 d[0]、d1 等....而不是项目......
Google colab 测试:
直接的方法应该是一个一个比较:
any(any((i == j).all() for j in c) for i in d[1::2])
或者使用一层或两层广播:
any((c == i).all(-1).any() for i in d[1::2])
(c[:, None] == d[None, 1::2]).all(-1).any()
使用broadcast可以计算的更快,但是必须先计算出所有的比较结果,然后用方法ndarray.any
进行校验,但是循环校验可以减少比较的次数
另外,np.isin
无法满足您的要求。只returns第一个参数的每个元素是否在第二个参数中
我有一个数组 c
,另一个数组 d
。如何检查 d[1]
ord[3]
ord[5]
ord[7]
是否在数组 c
?
c = np.array([[ 1, 1,0],
[ 1,-1,0],
[-1, 1,0],
[-1,-1,0]])
d = np.array([[2,2,2],
[1,1,0],
[2,8,8],
[6,8,8],
[2,2,2],
[4,9,0],
[2,2,2],
[3,2,2]])
我试过了 g = np.any(c == d[1,3,5,7])
,但是没用。在这种情况下,结果应该是 True
,因为 [1,1,0] 在数组 c
中。谁能帮帮我?
试试这个
# to check if a row in its entirety match a list,
# use all on axis=1 first, then check if any rows match using any
(c==[2,1,0]).all(1).any()
False
多次检查
# use bit-wise | (instead of or)
((c==[2,1,0]) | (c==[3,1,0]) | (c==[5,5,0])).all(1).any()
当您使用 numpy 时,请使用定义的函数 isin
:
https://numpy.org/doc/stable/reference/generated/numpy.isin.html
g = np.isin([ 2, 1,0],c)
编辑:正如@Phoenix 建议进行所有矢量检查,您需要在末尾添加所有 g = np.isin([ 2, 1,0],c).all()
this return False
。在协作中测试:
编辑:您更改了问题,但答案同样有效。这是检查 c 中所有 d 的方法: 将 numpy 导入为 np
c = np.array([[ 1, 1,0],
[ 1,-1,0],
[-1, 1,0],
[-1,-1,0]])
d = np.array([[2,2,2],
[1,1,0],
[2,8,8],
[6,8,8],
[2,2,2],
[4,9,0],
[2,2,2],
[3,2,2]])
for item in d:
g = np.isin(item,c).all()
print(g)
如果你想要 d 中的特定数组使用不带 for 的公式,只需输入 d[0]、d1 等....而不是项目...... Google colab 测试:
直接的方法应该是一个一个比较:
any(any((i == j).all() for j in c) for i in d[1::2])
或者使用一层或两层广播:
any((c == i).all(-1).any() for i in d[1::2])
(c[:, None] == d[None, 1::2]).all(-1).any()
使用broadcast可以计算的更快,但是必须先计算出所有的比较结果,然后用方法ndarray.any
进行校验,但是循环校验可以减少比较的次数
另外,np.isin
无法满足您的要求。只returns第一个参数的每个元素是否在第二个参数中