Numpy 在两个数组中找到相同的元素
Numpy find identical element in two arrays
假设我有一个数组 a
和 b
,我怎样才能在两个数组中找到相同的元素?
a = np.array([[262.5, 262.5, 45],
[262.5, 262.5, 15],
[262.5, 187.5, 45],
[262.5, 187.5, 15],
[187.5, 262.5, 45],
[187.5, 262.5, 15],
[187.5, 187.5, 45],
[187.5, 187.5, 15]])
b = np.array([[262.5, 262.5, 45],
[262.5, 262.5, 15],
[3,3,5],
[5,5,7],
[8,8,9]])
我试过下面的代码,但输出不是我想要的,谁能告诉我这段代码有什么问题吗?或者还有其他方法吗?
out = [x[(x == b[:,None]).all(1).any(0)] for x in a]
我想要的输出是:
array[[262.5, 262.5, 45],
[262.5, 262.5, 15]]
a[np.all([np.isin(ai, b) for ai in a], axis=1)]
或者还有:
b[np.all([np.isin(bi, a) for bi in b], axis=1)]
如果你没有一直使用 np
(我认为是这种情况,看到列表理解) - 你可以做一个 set
交集
x = set(map(tuple, a)).intersection(set(map(tuple, b)))
print(x)
# {(262.5, 262.5, 15.0), (262.5, 262.5, 45.0)}
您可以通过
将其转换回 np.ndarray
xarr = np.array(list(x))
print(xarr)
# array([[262.5, 262.5, 45. ],
# [262.5, 262.5, 15. ]])
不清楚你是否想要第一个连续的块。假设不是,并且您想要检索两个数组中具有相同索引且所有元素都相等的所有行:
import numpy as np
a = np.array(
[
[1, 1, 1],
[2, 2, 2],
[3, 3, 3],
[4, 4, 4],
[5, 5, 5],
[6, 6, 6],
]
)
b = np.array(
[
[1, 1, 1],
[2, 2, 2],
[0, 0, 0],
[0, 0, 0],
[5, 5, 5],
]
)
expected = np.array(
[
[1, 1, 1],
[2, 2, 2],
[5, 5, 5],
]
)
第一种方法是使用 for 循环,但可能效率不高:
out = np.array([x for x, y in zip(a, b) if np.all(x == y)])
assert np.all(out == expected)
第二种方法是矢量化的,效率更高,您只需要事先裁剪数组,因为它们的长度不同(zip
静默执行):
num_rows = min(a.shape[0], b.shape[0])
a_ = a[:num_rows]
b_ = b[:num_rows]
rows_mask = np.all(a_ == b_, axis=-1)
out = a_[rows_mask, :]
assert np.all(out == expected)
假设我有一个数组 a
和 b
,我怎样才能在两个数组中找到相同的元素?
a = np.array([[262.5, 262.5, 45],
[262.5, 262.5, 15],
[262.5, 187.5, 45],
[262.5, 187.5, 15],
[187.5, 262.5, 45],
[187.5, 262.5, 15],
[187.5, 187.5, 45],
[187.5, 187.5, 15]])
b = np.array([[262.5, 262.5, 45],
[262.5, 262.5, 15],
[3,3,5],
[5,5,7],
[8,8,9]])
我试过下面的代码,但输出不是我想要的,谁能告诉我这段代码有什么问题吗?或者还有其他方法吗?
out = [x[(x == b[:,None]).all(1).any(0)] for x in a]
我想要的输出是:
array[[262.5, 262.5, 45],
[262.5, 262.5, 15]]
a[np.all([np.isin(ai, b) for ai in a], axis=1)]
或者还有:
b[np.all([np.isin(bi, a) for bi in b], axis=1)]
如果你没有一直使用 np
(我认为是这种情况,看到列表理解) - 你可以做一个 set
交集
x = set(map(tuple, a)).intersection(set(map(tuple, b)))
print(x)
# {(262.5, 262.5, 15.0), (262.5, 262.5, 45.0)}
您可以通过
将其转换回np.ndarray
xarr = np.array(list(x))
print(xarr)
# array([[262.5, 262.5, 45. ],
# [262.5, 262.5, 15. ]])
不清楚你是否想要第一个连续的块。假设不是,并且您想要检索两个数组中具有相同索引且所有元素都相等的所有行:
import numpy as np
a = np.array(
[
[1, 1, 1],
[2, 2, 2],
[3, 3, 3],
[4, 4, 4],
[5, 5, 5],
[6, 6, 6],
]
)
b = np.array(
[
[1, 1, 1],
[2, 2, 2],
[0, 0, 0],
[0, 0, 0],
[5, 5, 5],
]
)
expected = np.array(
[
[1, 1, 1],
[2, 2, 2],
[5, 5, 5],
]
)
第一种方法是使用 for 循环,但可能效率不高:
out = np.array([x for x, y in zip(a, b) if np.all(x == y)])
assert np.all(out == expected)
第二种方法是矢量化的,效率更高,您只需要事先裁剪数组,因为它们的长度不同(zip
静默执行):
num_rows = min(a.shape[0], b.shape[0])
a_ = a[:num_rows]
b_ = b[:num_rows]
rows_mask = np.all(a_ == b_, axis=-1)
out = a_[rows_mask, :]
assert np.all(out == expected)