一个NumPy数组尺寸的一半。

3
假设我有一个4x4维度的numpy数组,并希望通过将其减半来将其更改为2x2。因此,理论上可以这样做:

enter image description here

这是否可能在不使用任何循环的情况下工作,并且能够适用于不仅是4x4而是比如500x500的情况?

#input:
x_4= np.array([[1, 2, 4, 5], [3, 4, 6, 8], [5, 3, 1, -1], [2, 3, 5, 0]])

# thinking it would work with something like this:
new = x_4[:2, :2]/4 + x_4[:2, -2:]/4 + x_4[-2:, :2]/4 + x_4[-2:, -2:]/4
new
# output: array([[11,  9],[16, 15]])

#Expected output: array([[2.5, 5.75], [3.25, 1.25]])

是的!这个操作被称为_平均池化_。 - jkr
两种解决方案都完美地运作了,谢谢。 - zay_117
3个回答

3

Numpy版本:

您可以重塑并在两个轴上执行均值计算,以获得所需的结果。

import numpy as np

blocksize = 500

Mat = np.random.rand(blocksize,blocksize)

## reshape into (blocksize/2 x blocksize/2 ) 2x2 matrices

blocks = Mat.reshape(blocksize//2, 2, blocksize//2, 2)

block_mean = np.mean(blocks, axis=(1,-1))


0
正如评论中所指出的那样,您可以使用池化技术,例如在scikit-image软件包中提供了该功能:
import skimage.measure
shape = (2, 2)
skimage.measure.block_reduce(x_4, shape, np.mean)

其中 shape 给出了您的池子的尺寸。


0

这个操作被称为平均池化,它用于卷积神经网络和图像处理中,以减少图像的维度。你可以使用 TensorFlowPyTorch,但首先需要将图像重塑为 (batch_size,Channels,Rows,Columns) 的形式,以便 PyTorch 能够正常工作。

import numpy as np
import torch
from torch import nn
m= nn.AvgPool2d(2, stride=2)
x_4= np.array([[1, 2, 4, 5], [3, 4, 6, 8], [5, 3, 1, -1], [2, 3, 5, 0]])
x_4=x_4[None,None,:,:]
x_4=torch.as_tensor(x_4,dtype=torch.float64)
x_4.shape
m(x_4).numpy()

输出

array([[[[2.5 , 5.75],
         [3.25, 1.25]]]])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接