python - 检查两个二维 numpy 数组的公共(public)元素,无论是行还是列

标签 python arrays performance numpy

给定 nx3mx3 的两个 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/

相关文章:

python - 如何在 PYMC3 中添加确定性向量运算?

python - 使用Python替换JSON文件中的单词

c++ - asio缓冲区深拷贝

performance - 如果有的话,我怎样才能提高我在 Clojure 中的数值性能?

python - 将二进制转换为十六进制等。没有功能。?

arrays - 如何将这个基于列表的代码转换为使用可变数组?

php - 使用路径在 PHP 数组中进行递归搜索

javascript - 数组混淆与查找和包含

Java 执行器服务

python - 计算属于 Pandas 时期的行