【发布时间】:2015-11-13 12:21:34
【问题描述】:
我有包含已转换为二维 numpy 数组的空间生态栖息地数据的栅格。在此数组中,值 1 = 数据,0 = 无数据。 从这些数据中,我想生成一个包含所有数据单元格对的数组,其中每个单元格之间的距离小于最大欧几里得截止距离(即相隔 2 个单元格)。
我发现this answer 很有用,但那里的答案似乎首先测量所有成对距离,然后通过最大截止值对结果进行阈值处理。我的数据集很大(13500*12000 数组中有超过 100 万个数据单元),因此任何试图计算 所有 对单元格之间的距离的成对距离测量都将失败:我需要一个以某种方式停止的解决方案在某个搜索半径(或类似的东西)之外寻找可能的邻居。
我已经尝试过scipy.spatial.distance.pdist,但到目前为止还没有运气将它应用于我的二维数据,或者找到一种方法来阻止pdist 计算即使是相距较远的单元格对之间的距离。我附上了一个示例数组和一个最大欧几里德截止距离 = 2 个单元的所需输出数组:
import numpy as np
import matplotlib.pyplot as plt
# Example 2-D habitat array (1 = data)
example_array = np.array([[0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0],
[0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1],
[0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
[1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],
[1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1],
[1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0],
[1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0],
[1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])
# Plot example array
plt.imshow(example_array, cmap="spectral", interpolation='nearest')
【问题讨论】:
-
一个简单的算法是:遍历每个数据点(r, c);取一个切片数组[r-D:r+D, c-D:c+D];将该切片中任何数据点的索引附加到您的结果中。不过,这对于您的数据集来说可能太慢了。该算法使用点之间的“曼哈顿”距离。如果您需要欧几里得,您可以预先计算一个蒙版以应用于切片。
-
对于每个单元格,您可以搜索感兴趣的半径内的相邻单元格。如果您的数组索引为 (i, j) 并且 max_radius 为 2,则 i 和 j 都从单元格索引迭代到单元格索引 [+2, +1, 0, -1, -2],除非 i=j。如果您需要最近的对,请在达到 max_radius 时使用带有截止的 BFS。
标签: python arrays numpy scipy distance