使用邻域和对 3D 数组进行子采样
Subsampling 3D array using the neighbourhood sum
标题可能令人困惑。我有一个相当大的 3D numpy 数组。我想通过合并大小 (2,2,2) 的块来将它的大小减少 2^3。新 3D 数组中的每个元素都应包含原始数组中相应块中元素的总和。
例如,考虑一个 4x4x4 数组:
input = [[[1, 1, 2, 2],
[1, 1, 2, 2],
[3, 3, 4, 4],
[3, 3, 4, 4]],
[[1, 1, 2, 2],
[1, 1, 2, 2],
[3, 3, 4, 4],
[3, 3, 4, 4]],
... ]]]
(为了节省space,我只代表了一半)。请注意,所有具有相同值的元素构成一个 (2x2x2) 块。输出应该是一个 2x2x2 数组,这样每个元素都是一个块的总和:
output = [[[8, 16],
[24, 32]],
... ]]]
所以8是所有1的和,16是2的和,依此类推。
有一个内置函数可以减少 block-wise - skimage.measure.block_reduce
-
In [36]: a
Out[36]:
array([[[1, 1, 2, 2],
[1, 1, 2, 2],
[3, 3, 4, 4],
[3, 3, 4, 4]],
[[1, 1, 2, 2],
[1, 1, 2, 2],
[3, 3, 4, 4],
[3, 3, 4, 4]]])
In [37]: from skimage.measure import block_reduce
In [39]: block_reduce(a, block_size=(2,2,2), func=np.sum)
Out[39]:
array([[[ 8, 16],
[24, 32]]])
使用其他归约 ufunc,比如 max-reduction
-
In [40]: block_reduce(a, block_size=(2,2,2), func=np.max)
Out[40]:
array([[[1, 2],
[3, 4]]])
使用 NumPy 工具实现这样的功能并不困难,可以像这样完成 -
def block_reduce_numpy(a, block_size, func):
shp = a.shape
new_shp = np.hstack([(i//j,j) for (i,j) in zip(shp,block_size)])
select_axes = tuple(np.arange(a.ndim)*2+1)
return func(a.reshape(new_shp),axis=select_axes)
标题可能令人困惑。我有一个相当大的 3D numpy 数组。我想通过合并大小 (2,2,2) 的块来将它的大小减少 2^3。新 3D 数组中的每个元素都应包含原始数组中相应块中元素的总和。
例如,考虑一个 4x4x4 数组:
input = [[[1, 1, 2, 2],
[1, 1, 2, 2],
[3, 3, 4, 4],
[3, 3, 4, 4]],
[[1, 1, 2, 2],
[1, 1, 2, 2],
[3, 3, 4, 4],
[3, 3, 4, 4]],
... ]]]
(为了节省space,我只代表了一半)。请注意,所有具有相同值的元素构成一个 (2x2x2) 块。输出应该是一个 2x2x2 数组,这样每个元素都是一个块的总和:
output = [[[8, 16],
[24, 32]],
... ]]]
所以8是所有1的和,16是2的和,依此类推。
有一个内置函数可以减少 block-wise - skimage.measure.block_reduce
-
In [36]: a
Out[36]:
array([[[1, 1, 2, 2],
[1, 1, 2, 2],
[3, 3, 4, 4],
[3, 3, 4, 4]],
[[1, 1, 2, 2],
[1, 1, 2, 2],
[3, 3, 4, 4],
[3, 3, 4, 4]]])
In [37]: from skimage.measure import block_reduce
In [39]: block_reduce(a, block_size=(2,2,2), func=np.sum)
Out[39]:
array([[[ 8, 16],
[24, 32]]])
使用其他归约 ufunc,比如 max-reduction
-
In [40]: block_reduce(a, block_size=(2,2,2), func=np.max)
Out[40]:
array([[[1, 2],
[3, 4]]])
使用 NumPy 工具实现这样的功能并不困难,可以像这样完成 -
def block_reduce_numpy(a, block_size, func):
shp = a.shape
new_shp = np.hstack([(i//j,j) for (i,j) in zip(shp,block_size)])
select_axes = tuple(np.arange(a.ndim)*2+1)
return func(a.reshape(new_shp),axis=select_axes)