【问题标题】:Filter numpy ndarray with another ndarray, row by row用另一个 ndarray 逐行过滤 numpy ndarray
【发布时间】:2018-06-05 05:02:22
【问题描述】:

我有 2 个 numpy ndarray

第一个包含 x 和 y 值:

xy_arr = [[ 736190.125         1130.        ]
 [ 736190.16666667    1130.        ]
 [ 736190.20833333    1130.        ]
...,
 [ 736190.375         1140.        ]
 [ 736190.41666667    1140.        ]
 [ 736190.45833333    1140.        ]
 [ 736190.5           1140.        ]]

第二个有 x y 和索引值并且比第一个大得多:

xyind_arr = [[  7.35964000e+05   1.02000000e+03   0.00000000e+00]
 [  7.35964042e+05   1.02000000e+03   1.00000000e+00]
 [  7.35964083e+05   1.02000000e+03   2.00000000e+00]
 ..., 
 [  7.36613397e+05   1.09500000e+03   3.07730000e+04]
 [  7.36613404e+05   1.10000000e+03   3.07740000e+04]
 [  7.36613411e+05   1.10500000e+03   3.07750000e+04]]

我想保留 xyind_arr 的所有行,其中 xy_arr 中的值相同,例如:

(xyind_arr[:,0] == xy_arr[:,0]) 和 (xyind_arr[:,1] == xy_arr[:,1])

我的代码:

sub_array = xyind_arr[((xyind_arr[:, 0] == xy_arr[:, 0]) &
                       (xyind_arr[:, 1] == xy_arr[:, 1]))]

仅当 xy_array 有一个元素时才有效。 例如:

import numpy as np

xy_arr = np.array([[56, 400]])
xyind_arr = np.array([[5, 6, 0],[8, 12, 1],[9, 17, 2],[56, 400, 3],[23, 89, 4]])

sub_array = xyind_arr[((xyind_arr[:, 0] == xy_arr[:, 0]) &
                       (xyind_arr[:, 1] == xy_arr[:, 1]))]

print(sub_array)

结果正常:

[[ 56 400   3]]

但是有

xy_arr = np.array([[5, 6],[8, 12],[23, 89]])

结果是

[]

我期待

[[5, 6, 0],[8, 12, 1],[23, 89, 4]]

有没有什么干净的numpy方法来获取这个过滤后的子数组?


编辑:

最后我放弃了 numpy 解决方案并使用了 python set() :

    xy_arr_set = set(map(tuple, xy_arr))
    xyind_arr_set = set(map(tuple, xyind_arr))
    for x, y, ind in xyind_arr_set:
        if (x,y) in xy_arr_set:
            "do what i need"

【问题讨论】:

  • 请发布实际有效的 Python 代码数据。
  • 您的预期输出是什么?
  • 输出是 xyind 数组的所有行,其中 xyind_array.x == xy_array.x 和 xyind_array.y == xy_array.y
  • 您似乎想通过 tuple 相等性的条件过滤xyind_arr。您需要第一列和第二列像复合键一样存在于单行的较小数组中。将xy_arr 转换为某种类型的setdict 结构,这样可以有效地查找它,这比将它硬塞到复杂的numpy 过滤中要好得多。

标签: python numpy multidimensional-array filter sub-array


【解决方案1】:

numpy.isin,但它只针对标量数组进行测试;其中没有元组比较。您可以使用此方法查找 Array1 的所有行,其中第 0 列条目位于 Array2 的第 0 列中,并且第 1 列条目位于 Array2 的第 1 列中。但这与您的任务不同,因为不能保证第 0 项和第 1 项都在 Array2 的同一行中找到

由于xyind_arr 大得多,我认为循环遍历较小的数组xy_arr 应该是可以接受的,一次应用xy_arr 过滤器之一,然后连接结果。为此,xy_arr 的行必须是唯一的,因此最好先检查一下:

xy_arr = np.unique(xy_arr, axis=0)    
sub_array = np.concatenate([xyind_arr[(xyind_arr[:, 0] == xy_arr[k, 0]) &
                            (xyind_arr[:, 1] == xy_arr[k, 1])]
                            for k in np.arange(xy_arr.shape[0])], axis=0) 

注意:不会保留行的顺序。

【讨论】:

    猜你喜欢
    • 2021-10-15
    • 2018-10-10
    • 2016-09-23
    • 2018-04-12
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2017-09-08
    • 1970-01-01
    相关资源
    最近更新 更多