我有一个生态栖息地的栅格,我已经转换成二维Python numpy数组(下面的example_array).我还有一个包含具有唯一值的"种子"区域的数组(下面的seed_array),我想用它来对我的栖息地区域进行分类.我想将我的种子区域"种植"到我的栖息地区域,以便为栖息地分配最近种子区域的ID,通过栖息地区域进行测量.例如:
我最好的方法是使用该ndimage.distance_transform_edt
函数创建一个数组,描述数据集中每个单元格最近的"种子"区域,然后将其替换回栖息地数组.然而,这并不是特别好用,因为该功能不能测量"通过"我的栖息地区域的距离,例如下面的红色圆圈表示错误分类的单元格:
下面是我的栖息地和种子数据的示例数组,以及我正在寻找的输出类型的示例.我的实际数据集要大得多 - 超过一百万个栖息地/种子区域.任何帮助将非常感激!
import numpy as np
import scipy.ndimage as ndimage
import matplotlib.pyplot as plt
# Sample study area array
example_array = np.array([[0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 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, 1, 0, 1, 0],
[1, 1, 1, …
Run Code Online (Sandbox Code Playgroud) 我有一个带有一组唯一ID补丁/区域的栅格,我已将其转换为二维Python numpy数组.我想计算所有区域之间的成对欧几里德距离,以获得分隔每个光栅补丁的最近边缘的最小距离.由于阵列最初是光栅,因此解决方案需要考虑跨越单元的对角线距离(我总是可以通过乘以光栅分辨率将单元格中测量的任何距离转换回米).
我已经根据相关问题的答案中的建议尝试了该cdist
功能,但到目前为止,我一直无法使用可用的文档来解决我的问题.作为最终结果,理想情况下,我将以"从ID到ID,距离"的形式具有3×X阵列,包括所有可能的区域组合之间的距离.scipy.spatial.distance
这是一个类似于我的输入数据的示例数据集:
import numpy as np
import matplotlib.pyplot as plt
# Sample study area array
example_array = np.array([[0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 2, 0, 2, 2, 0, 6, 0, 3, 3, 3],
[0, 0, 0, 0, 2, 2, 0, 0, 0, 3, 3, 3],
[0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0],
[0, 0, 0, 0, 0, 0, …
Run Code Online (Sandbox Code Playgroud) 我有一个独立变量值的一维数组(x_array
),它与具有多个时间步长()的3D numpy空间数据数组中的时间步长相匹配y_array
.我的实际数据要大得多:300+时间步长和高达3000*3000像素:
import numpy as np
from scipy.stats import linregress
# Independent variable: four time-steps of 1-dimensional data
x_array = np.array([0.5, 0.2, 0.4, 0.4])
# Dependent variable: four time-steps of 3x3 spatial data
y_array = np.array([[[-0.2, -0.2, -0.3],
[-0.3, -0.2, -0.3],
[-0.3, -0.4, -0.4]],
[[-0.2, -0.2, -0.4],
[-0.3, np.nan, -0.3],
[-0.3, -0.3, -0.4]],
[[np.nan, np.nan, -0.3],
[-0.2, -0.3, -0.7],
[-0.3, -0.3, -0.3]],
[[-0.1, -0.3, np.nan],
[-0.2, -0.3, np.nan],
[-0.1, np.nan, np.nan]]])
Run Code Online (Sandbox Code Playgroud)
我想计算每个像素的线性回归,将获得的R平方,P值,截距和斜率为每个xy
像素y_array
,为每个时间步长值 …
我有一个numpy数组,我希望将其划分为具有唯一ID的离散区域,如下所示:
通常对于这样的事情,我会使用scipy.ndimage.label为离散blob生成唯一的id,但是在这种情况下我有几个非常大的连续区域,我也希望将它们分割成更小的独特区域,理想情况是当它们只是连接时通过1个小区的连接到他们的邻居.为了说明,这是一个示例数组,我在运行scipy.ndimage.label时获得的结果,以及我想要的结果:
import numpy as np
import scipy.ndimage as ndimage
import matplotlib.pyplot as plt
# Sample study area array
example_array = np.array([[0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1],
[0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0],
[1, 1, 1, 0, 0, …
Run Code Online (Sandbox Code Playgroud) 我试图通过删除所有完全隔离的单个单元来减少二进制python数组中的噪声,即如果它们完全被其他"0"包围,则将"1"值单元设置为0.通过使用循环删除大小等于1的blob,我已经能够获得一个有效的解决方案,但对于大型数组来说,这似乎是一个非常低效的解决方案:
import numpy as np
import scipy.ndimage as ndimage
import matplotlib.pyplot as plt
# Generate sample data
square = np.zeros((32, 32))
square[10:-10, 10:-10] = 1
np.random.seed(12)
x, y = (32*np.random.random((2, 20))).astype(np.int)
square[x, y] = 1
# Plot original data with many isolated single cells
plt.imshow(square, cmap=plt.cm.gray, interpolation='nearest')
# Assign unique labels
id_regions, number_of_ids = ndimage.label(square, structure=np.ones((3,3)))
# Set blobs of size 1 to 0
for i in xrange(number_of_ids + 1):
if id_regions[id_regions==i].size == 1:
square[id_regions==i] = 0
# Plot desired …
Run Code Online (Sandbox Code Playgroud) 我有两个带有相同形状的标记的 2D numpya
数组b
。我想b
通过类似于两个数组的GIS 几何并集的方式重新标记数组,以便为数组中具有唯一值组合的单元格a
分配b
新的唯一 ID:
我不关心输出中区域的具体编号,只要这些值都是唯一的即可。我在下面附加了示例数组和所需的输出:我的真实数据集要大得多,两个数组都有范围从“1”到“200000”的整数标签。到目前为止,我已经尝试连接数组 ID 以形成唯一的值组合,但理想情况下,我希望以 1、2、3...等形式输出一组简单的新 ID。
import numpy as np
import matplotlib.pyplot as plt
# Example labelled arrays a and b
input_a = np.array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 0],
[0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 0],
[0, 1, 1, 1, …
Run Code Online (Sandbox Code Playgroud) 我xr.DataArray
从OpenDataCube查询返回了相当大的1000 x 4000像素,并且有一大组(> 200,000)xy
点值。我需要对数组进行采样以在每个xy
点下返回一个值,并返回内插的值(例如,如果该点降落在a 0
和1.0
像素之间的中间位置,则返回的值应该是0.5
)。
xr.interp
让我可以轻松地对插值进行采样,但是它返回所有x
和y
值的每个组合的巨大矩阵,而不仅仅是返回每个xy
点本身的值。我尝试使用np.diagonal
来提取xy
点值,但这很慢,很快会遇到内存问题,并且由于我仍然需要等待通过插值的每个组合,因此效率很低xr.interp
。
可复制的例子
(仅使用10,000个采样点(理想情况下,我需要的东西可以扩展到> 200,000或更多):
# Create sample array
width, height = 1000, 4000
val_array = xr.DataArray(data=np.random.randint(0, 10, size=(height, width)).astype(np.float32),
coords={'x': np.linspace(3000, 5000, width),
'y': np.linspace(-3000, -5000, height)}, dims=['y', 'x'])
# Create sample points
n = 10000
x_points = np.random.randint(3000, 5000, size=n)
y_points = np.random.randint(-5000, -3000, size=n)
Run Code Online (Sandbox Code Playgroud)
目前的方法 …