我有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"
答案 0 :(得分:0)
有numpy.isin
但它仅针对标量数组进行测试;它没有元组比较。您可以使用此方法查找Array1的所有行,其中第0列条目位于Array2的第0列,第1列条目也位于Array2的第1列。但这与您的任务不同,因为无法保证在Array2的同一行中找到第0个和第1个条目。
由于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)
注意:不会保留行的顺序。