【发布时间】: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转换为某种类型的set或dict结构,这样可以有效地查找它,这比将它硬塞到复杂的numpy 过滤中要好得多。
标签: python numpy multidimensional-array filter sub-array