numpy 用2D分区阵列处理3D阵列,并通过时间获得统计数据

2hh7jdfx  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(177)

我想为下面的示例3D数组中的每个‘区域’生成统计数据。分区由下面提供的二维数组定义。如果3D数组中的第一个索引表示时间索引(另外两个索引表示空间坐标),我如何生成每个区域的平均值随时间变化的时间序列?最终结果将是长度为10的4次序列(因为有4个区域-0表示非活动区域)。
启动代码:

import numpy as np

# Create example 3d array

sampl = np.random.uniform(low=0.1, high=10, size=(10,6,6))

# Generate an example zone array

zn = np.array([
    0,1,1,2,2,0,
    1,1,1,2,2,2,
    1,1,1,2,2,2,
    3,3,3,4,4,4,
    3,3,3,4,4,4,
    0,0,3,4,0,0,
])
hfyxw5xn

hfyxw5xn1#

由于区域的大小不同,您的目标数据是锯齿状的,解决方案只能部分矢量化。如果保证这些区域的大小相同,这将会得到改善。

import numpy as np
from numpy.random import default_rng

rand = default_rng(seed=0)

zones = np.array((
    (0,1,1,2,2,0),
    (1,1,1,2,2,2),
    (1,1,1,2,2,2),
    (3,3,3,4,4,4),
    (3,3,3,4,4,4),
    (0,0,3,4,0,0),
))
sample = rand.uniform(low=0.1, high=10, size=(10, *zones.shape))

zone_values = np.unique(zones)[1:]
mask_y, mask_x, mask_zone = (
    zones[..., np.newaxis] == zone_values[np.newaxis, np.newaxis, :]
).nonzero()
slices = sample[:, mask_y, mask_x]

for zone in range(len(zone_values)):
    slice = slices[:, mask_zone == zone]
    print(slice.shape, slice.mean())
(10, 8) 5.356025823305826
(10, 8) 4.998502146907645
(10, 7) 5.568793552270735
(10, 7) 5.641964094593679

相关问题