You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何保持原形状缩放3D numpy数组?求替代裁剪/补零方案

3D数组缩放后保持原形状的解决方案

是否存在优于裁剪/零填充的方案?

目前没有比裁剪或零填充更直接的方案——scipy.ndimage.zoom会严格按照缩放因子计算输出形状,要强制匹配原尺寸,只能通过截断超出部分或补充缺失部分来实现。相对而言,中间裁剪(缩放因子大于1时)和对称零填充(缩放因子小于1时)是比较合理的选择,它们能尽量保留缩放后数据的核心区域,同时保持中心对齐,减少信息偏移。

缩放因子>1时的中间裁剪实现(以缩放因子2为例)

当缩放因子为2时,原形状(240,240,155)会被放大到(480,480,310),我们只需要从放大后的数组中心裁剪出原尺寸即可:

import numpy as np
from scipy.ndimage import zoom

# 替换为你的实际3D数组
original_arr = np.random.rand(240, 240, 155)
zoom_factor = 2

# 执行缩放(order控制插值精度,3为双三次插值,可按需调整)
zoomed_arr = zoom(original_arr, zoom_factor, order=3)

# 计算每个维度的裁剪起始/结束索引
orig_shape = original_arr.shape
zoom_shape = zoomed_arr.shape
start_idx = [(z_dim - o_dim) // 2 for z_dim, o_dim in zip(zoom_shape, orig_shape)]
end_idx = [s + o for s, o in zip(start_idx, orig_shape)]

# 中心裁剪回原尺寸
cropped_arr = zoomed_arr[start_idx[0]:end_idx[0],
                         start_idx[1]:end_idx[1],
                         start_idx[2]:end_idx[2]]

# 验证结果形状
print(cropped_arr.shape)  # 输出 (240, 240, 155)

缩放因子<1时的零填充实现(以缩放因子0.5为例)

当缩放因子为0.5时,原数组会缩小到(120,120,77),我们需要创建一个和原尺寸相同的零数组,把缩小后的数组放到中心位置:

import numpy as np
from scipy.ndimage import zoom

# 替换为你的实际3D数组
original_arr = np.random.rand(240, 240, 155)
zoom_factor = 0.5

# 执行缩放
zoomed_arr = zoom(original_arr, zoom_factor, order=3)

# 计算每个维度的填充量(前后/左右/上下对称填充,剩余1个像素补在末尾)
orig_shape = original_arr.shape
zoom_shape = zoomed_arr.shape
pad_config = []
for o_dim, z_dim in zip(orig_shape, zoom_shape):
    total_pad = o_dim - z_dim
    pad_front = total_pad // 2
    pad_back = total_pad - pad_front
    pad_config.append((pad_front, pad_back))

# 零填充并居中
padded_arr = np.pad(zoomed_arr, pad_config, mode='constant', constant_values=0)

# 验证结果形状
print(padded_arr.shape)  # 输出 (240, 240, 155)

内容的提问来源于stack exchange,提问作者Janikas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 06:54:07