【问题标题】:Numpy scale 3D arrayNumpy 比例 3D 数组
【发布时间】:2015-03-23 19:31:09
【问题描述】:

我正在尝试将 3D 数组缩放到 64x64x64 大小(从更大的非立方体大小),同时保持纵横比。

我在这样的二维数组中做了同样的事情:

pad = Input.size[1]-Input.size[0]
padLeft = math.ceil(pad/2)
padRight = math.floor(pad/2)

if(pad > 0):
    paddedInput = np.pad(Input, ((0,0), (padLeft,padRight)), 'constant', constant_values=(0,0))
else:
    paddedInput = np.pad(Input, ((math.fabs(padLeft),math.fabs(padRight)), (0,0)), 'constant', constant_values=(0,0))

Output = misc.imresize(paddedInput,(InputHeight,InputHeight))

有没有办法在 N (=3) 维度上实现相同的目标?

编辑:我尝试转换为 3D:

pad = np.zeros((3,1))
pad[0,0] = max(Input.shape) - Input.shape[0]
pad[1,0] = max(Input.shape) - Input.shape[1]
pad[2,0] = max(Input.shape) - Input.shape[2]

paddedInput = np.zeros((max(Input.shape),max(Input.shape),max(Input.shape)))
print(paddedInput.shape)

for dimension in range(0,3):
    padLeft = math.ceil(pad[dimension,0]/2)
    padRight = math.floor(pad[dimension,0]/2)
    if((padLeft > 0) or (padRight > 0)):
        if dimension == 0:
            paddedInput = np.pad(Input, ((padLeft,padRight),(0,0),(0,0)), 'constant', constant_values=0)
        elif dimension == 1:
            paddedInput = np.pad(paddedInput, ((0,0), (padLeft,padRight),(0,0)), 'constant', constant_values=0)
        elif dimension == 2:
            paddedInput = np.pad(paddedInput, ((0,0),(0,0), (padLeft,padRight)), 'constant', constant_values=0)
print(paddedInput.shape)

这会运行,但被填充的尺寸会被填充两倍的量......

【问题讨论】:

  • 要扩展哪些轴?

标签: python arrays numpy scaling multi-dimensional-scaling


【解决方案1】:

看看scipy.ndimage中的zoom。在这里,您提供沿每个轴的缩放因子,而不是最终的立方体大小,但这很容易计算出来。

inarr = np.ones((32,32,32))
outarr = ndimage.zoom(inarr, 2)
outarr.shape
(64, 64, 64)

【讨论】:

  • 你能举个例子吗?我对 test = ndimage.interpolation.zoom(Input, float(Input.shape[0])/target.shape[0]) 的尝试给出了太大的结果,但是翻转分数会给出 (0,0,0)尺寸
  • 也许您正遭受整数除法的困扰?你没有说你的输入尺寸是什么。
  • 大约 190、60、170。理想情况下,我也想保持纵横比,我认为缩放不允许这样做?这就是我在 2D 示例中填充的原因
  • 另外,你打算如何在每个维度上调整不同的大小并保持纵横比?也许您的意思是调整大小以使最大尺寸长度变为 64?然后你就可以垫了。
【解决方案2】:

答案是先使用pad,然后使用numpy.ndarray.resize():

pad = np.zeros((3,1))
pad[0,0] = max(Input.shape) - Input.shape[0]
pad[1,0] = max(Input.shape) - Input.shape[1]
pad[2,0] = max(Input.shape) - Input.shape[2]

paddedInput = np.zeros((max(Input.shape),max(Input.shape),max(Input.shape)))

paddedInput = np.pad(Input, ((int(math.ceil(pad[0,0]/2)),
    int(math.floor(pad[0,0]/2))),(int(math.ceil(pad[1,0]/2)),
    int(math.floor(pad[1,0]/2))),(int(math.ceil(pad[2,0]/2)),
    int(math.floor(pad[2,0]/2)))), 'constant', constant_values=0)

paddedInput.resize((64,64,64))

在一行上做所有的 pad 可以修复所有错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 2012-12-09
    相关资源
    最近更新 更多