比较两个numpy数组:(x1,y1)和(x2,y2),以检查元素是否相交

时间:2018-08-08 22:30:40

标签: python arrays numpy

我在尝试获取一个布尔数组时遇到麻烦,该数组指示何时第二个numpy数组中的元素也位于第一个数组中。

最具挑战性的部分是每个数组都由纬度/经度对组成,我想确保第二坐标中的每个纬度/经度也在第一坐标中。所以,这就像一个十字路口

这是我到目前为止所做的(示例坐标较小):

firstlat = [0, 1, 5, 5]
firstlon = [1, 0, 5, 4]

secondlat = [0, 2, 0, 5]
secondlon = [1, 2, 5, 5]

firstcoords = numpy.array((firstlat, firstlon))
firstcoords = numpy.transpose(firstcoords) # gets lat/lon pair


secondcoords = numpy.array((secondlat, secondlon))
secondcoords = numpy.transpose(secondcoords)

a = numpy.isin(secondcoords, firstcoords)

Wrong output:
[[ True  True]
[False False]
[ True  True]
[ True  True]]

Wanted output: [[True, False, False, True]]

Numpy使参数变平,因此尽管firstcoords[0] = [0 1]似乎在“逐个元素”地比较它是不合适的。但是,正如我所看到的,每个元素都包含[lat lon];进行转置的目的是使lat / lons以元组或类似元组的形式进行比较。那么,我该如何解决我的方法,或者针对此问题还有哪些其他可行的方法?

4 个答案:

答案 0 :(得分:0)

如果将纬度和经度压缩成元组:

firstlat = [0, 1, 5, 5]
firstlon = [1, 0, 5, 4]

secondlat = [0, 2, 0, 5]
secondlon = [1, 2, 5, 5]

first_lat_lon = list(zip(firstlat,firstlon))
second_lat_lon = list(zip(secondlat,secondlon))

然后,您可以轻松检查第二个列表中的哪个:

[x in first_lat_lon for x in second_lat_lon]

哪个返回:

[True, False, False, True]

答案 1 :(得分:0)

我不知道您要寻找的功能是否可以在numpy中实现。我建议使用以下内容:

in_second_and_first = set(zip(secondlat,secondlon)) & set(zip(firstlat,firstlon))

如果您使用的是Python 2(强烈建议您反对),请使用itertools.izip而不是内置的zip

答案 2 :(得分:0)

使用isin的一种方法是使用structured arrays,尽管您的数组并不是真正的一维数组。

firstlat = [0, 1, 5, 5]
firstlon = [1, 0, 5, 4]

secondlat = [0, 2, 0, 5]
secondlon = [1, 2, 5, 5]

firstcoords = np.array(list(zip(firstlat, firstlon)), dtype=[("lat", int), ("lon", int)])
# array([(0, 1), (1, 0), (5, 5), (5, 4)], dtype=[('lat', '<i8'), ('lon', '<i8')])
secondcoords = np.array(list(zip(secondlat, secondlon)), dtype=[("lat", int), ("lon", int)])
# array([(0, 1), (2, 2), (0, 5), (5, 5)], dtype=[('lat', '<i8'), ('lon', '<i8')])

np.isin(secondcoords, firstcoords)
# array([ True, False, False,  True])

参考

How to make Numpy treat each row/tensor as a value

Get intersecting rows across two 2D numpy arrays

答案 3 :(得分:0)

使用np.void视图。这只是将每一行看作是数据块,而不是离散值。

def vview(a):  #based on @jaime's answer: https://stackoverflow.com/a/16973510/4427777
    return np.ascontiguousarray(a).view(np.dtype((np.void, a.dtype.itemsize * a.shape[1])))

然后,您可以根据需要使用np.isin

a = numpy.isin(vview(secondcoords), vview(firstcoords))

请注意,这是在数据级别上的比较,因此,如果您的实际数据是浮点型的,则没有办法处理浮点错误。另一方面,它非常快,因为它不需要以任何方式重组或复制数据。