我有一个非常基本的问题,从理论上讲它很容易做到(在ArcGIS中更少的点数和大量的人工工作),但是我根本无法从编码开始来解决这个问题(我也是复杂的python编码的新手。)
我有2个变量'Root zone'又名RTZ
和'Tree cover'又名TC
都是250x186值的数组(基本上是网格,每个网格都有特定的值)。 TC
中的值从0到100不等。每个网格大小为0.25度(可能有助于理解距离)。
我的问题是“我想计算每个TC
值的距离,范围为50-100(因此,每个lat
和lon
的TC值的每个值都大于50)从最近的TC
到0-30之间(小于30)的点开始。”
仅考虑到我们没有考虑TC
的np.nan部分。因此,TC
中的白色部分在RZS
中也是白色的。
我想做的是创建一个二维散点图,其中X轴表示“从0-30值到50-100 TC
的距离”,Y轴表示“ RZS
”的50-100 TC
分中。上图可能使情况更清楚。
我希望可以为此提供任何代码,但我什至不能从远距离开始。 请提供任何有关如何进行此操作的建议。
我们来看一个例子: 如果您查看x:70和y:70,则可以看到很多点,整个数据集中的树覆盖范围为0-30。但是我只希望从最接近的值到我的点的距离介于0到30之间。
答案 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()
现在做真实的工作:
# 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)
由于网格(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之间均匀分布。
这仅仅是输入示例数据的结果,并不能完全代表真实数据。