按行用另一个数组筛选numpy ndarray

2024-06-16 11:51:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个月的时间

第一个包含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\u arr的所有行,其中xy\u arr中的值是相同的,如下所示:

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

我的代码:

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

仅当xy\U数组有一个元素时才起作用。 例如:

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"

Tags: and代码innumpy元素mapnp时间
1条回答
网友
1楼 · 发布于 2024-06-16 11:51:08

^{},但它只针对标量数组进行测试;其中没有元组比较。可以使用此方法查找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) 

注意:将不保留行的顺序。你知道吗

相关问题 更多 >