numpy 有没有一个数值函数可以把一个(k,m,n)矩阵压缩成一个(k//2,m//2,n//2)矩阵?

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

这可以通过以下方式实现

cube = (
    cube[::2, ::2, ::2]
    + cube[1::2, ::2, ::2]
    + cube[::2, 1::2, ::2]
    + cube[1::2, 1::2, ::2]
    + cube[::2, ::2, 1::2]
    + cube[1::2, ::2, 1::2]
    + cube[::2, 1::2, 1::2]
    + cube[1::2, 1::2, 1::2]
)

但我想知道是否有一个功能可以快速而干净地完成这一点。如果没有,这个行动有没有一个规范的名字?

7tofc5zh

7tofc5zh1#

这听起来像是经典的跨步卷积合并操作。
您可以通过多种方式完成此操作,但最直接的方法可能是使用skImage的block_reduce功能,如下所示-

from skimage.measure import block_reduce
a = np.arange(6*8*4).reshape(6, 8, 4)
reduced_a = block_reduce(a, block_size=(2, 2, 2), func=np.sum) 

# Make sure the dimensions are as expected:

print(reduced_a.shape)

# (3, 4, 2)

# Test specific value for correct reduction of matrix:

assert reduced_a[0, 0, 0] == np.sum(a[:2, :2, :2])

# And more generally, for any index:

i, j, k = 2, 0, 1
assert reduced_a[i, j, k] == np.sum(a[i*2:i*2+2, j*2:j*2+2, k*2:k*2+2])

另一种方法是直接将“立方体”与“一”内核卷积,然后对所需的2步长进行子采样:

from scipy import ndimage
convolved_a = ndimage.convolve(a, np.ones((2, 2, 2)))[::2, ::2, ::2]

# Assert that this is indeed the same:

assert np.all(convolved_a == reduced_a)
sqyvllje

sqyvllje2#

在纯numpy中(也就是说,如果您被困在不可扩展的API中,或者试图限制依赖项),您可以使用我的配方here

cube = np.sum(window_nd(cube, 2, 2), (-3, -2, -1))

相关问题