numpy数组中两组值之间的距离

时间:2019-05-03 14:52:36

标签: python arrays graph distance

我有一个非常基本的问题,从理论上讲它很容易做到(在ArcGIS中更少的点数和大量的人工工作),但是我根本无法从编码开始来解决这个问题(我也是复杂的python编码的新手。)

我有2个变量'Root zone'又名RTZ和'Tree cover'又名TC都是250x186值的数组(基本上是网格,每个网格都有特定的值)。 TC中的值从0到100不等。每个网格大小为0.25度(可能有助于理解距离)。

我的问题是“我想计算每个TC值的距离,范围为50-100(因此,每个latlon的TC值的每个值都大于50)从最近的TC到0-30之间(小于30)的点开始。”

仅考虑到我们没有考虑TC的np.nan部分。因此,TC中的白色部分在RZS中也是白色的。 enter image description here

我想做的是创建一个二维散点图,其中X轴表示“从0-30值到50-100 TC的距离”,Y轴表示“ RZS”的50-100 TC分中。上图可能使情况更清楚。

我希望可以为此提供任何代码,但我什至不能从远距离开始。 请提供任何有关如何进行此操作的建议。

我们来看一个例子: 如果您查看x:70和y:70,则可以看到很多点,整个数据集中的树覆盖范围为0-30。但是我只希望从最接近的值到我的点的距离介于0到30之间。

1 个答案:

答案 0 :(得分:1)

以下代码可能适用于随机示例数据:

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
# Create some completely random data, and include an area of NaNs as well
rzs = np.random.uniform(0, 100, size=(250, 168))
tc = np.random.lognormal(3.0, size=(250, 168))
tc = np.clip(tc, 0, 100)
rzs[60:80,:] = np.nan
tc[60:80,:] = np.nan

plt.subplot(2,2,1)
plt.imshow(rzs)
plt.colorbar()
plt.subplot(2,2,2)
plt.imshow(tc)
plt.colorbar()

enter image description here

现在做真实的工作:

# Select the indices of the low- and high-valued points
# This will results in warnings here because of NaNs;
# the NaNs should be filtered out in the indices, since they will 
# compare to False in all the comparisons, and thus not be 
# indexed by 'low' and 'high'
low = (tc >= 0) & (tc <= 30)
high = (tc >= 50) & (tc <= 100)
# Get the coordinates for the low- and high-valued points,
# combine and transpose them to be in the correct format
y, x = np.where(low)
low_coords = np.array([x, y]).T
y, x = np.where(high)
high_coords = np.array([x, y]).T

# We now calculate the distances between *all* low-valued points, and *all* high-valued points.
# This calculation scales as O^2, as does the memory cost (of the output), 
# so be wary when using it with large input sizes.
from scipy.spatial.distance import cdist, pdist
distances = cdist(low_coords, high_coords)

# Now find the minimum distance along the axis of the high-valued coords, 
# which here is the second axis.
# Since we also want to find values corresponding to those minimum distances, 
# we should use the `argmin` function instead of a normal `min` function.
indices = distances.argmin(axis=1)
mindistances = distances[np.arange(distances.shape[0]), indices]
minrzs = rzs.flatten()[indices]

plt.scatter(mindistances, minrzs)

enter image description here

由于网格(1,sqrt(1 ^ 1 + 1 ^ 1),2,sqrt(1 ^ 1 + 2 ^ 2),sqrt( 2 ^ 2 + 2 ^ 2),3,sqrt(1 ^ 1 + 3 ^ 2),...);这是因为两个TC值都是随机分布的,因此低值可能最终直接与高值相邻(并且由于我们正在寻找最小距离,因此大多数标绘点都针对这些情况)。垂直分布是因为RZS值在0到100之间均匀分布。
这仅仅是输入示例数据的结果,并不能完全代表真实数据。