给定 nx3
和 mx3
的两个 numpy
数组,确定行索引(计数器)的有效方法是什么?两个数组中共有的。例如,我有以下解决方案,对于更大的数组来说,该解决方案的速度明显慢
def arrangment(arr1,arr2):
hits = []
for i in range(arr2.shape[0]):
current_row = np.repeat(arr2[i,:][None,:],arr1.shape[0],axis=0)
x = current_row - arr1
for j in range(arr1.shape[0]):
if np.isclose(x[j,0],0.0) and np.isclose(x[j,1],0.0) and np.isclose(x[j,2],0.0):
hits.append(j)
return hits
它检查arr2
的行是否存在于arr1
中,并返回arr1
中行匹配的行索引。我需要这种排列方式始终按 arr2 的行顺序升序。例如给定
arr1 = np.array([[-1., -1., -1.],
[ 1., -1., -1.],
[ 1., 1., -1.],
[-1., 1., -1.],
[-1., -1., 1.],
[ 1., -1., 1.],
[ 1., 1., 1.],
[-1., 1., 1.]])
arr2 = np.array([[-1., 1., -1.],
[ 1., 1., -1.],
[ 1., 1., 1.],
[-1., 1., 1.]])
该函数应返回:
[3, 2, 6, 7]
最佳答案
快速而肮脏的答案
(arr1[:, None] == arr2).all(-1).argmax(0)
array([3, 2, 6, 7])
更好的答案
处理 arr2
中的一行与 arr1
t = (arr1[:, None] == arr2).all(-1)
np.where(t.any(0), t.argmax(0), np.nan)
array([ 3., 2., 6., 7.])
正如 @Divakar 所指出的,np.isclose
解释了比较 float 时的舍入误差
t = np.isclose(arr1[:, None], arr2).all(-1)
np.where(t.any(0), t.argmax(0), np.nan)
关于python - 检查两个二维 numpy 数组的公共(public)元素,无论是行还是列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41234161/