如何“缩放”numpy数组?

40 投票
4 回答
47164 浏览
提问于 2025-04-17 02:54

我想把一个形状为 (h, w) 的数组放大一个倍数 n,这样就会变成一个形状为 (h*n, w*n) 的数组。

比如说,我有一个 2x2 的数组:

array([[1, 1],
       [0, 1]])

我想把这个数组放大成 4x4 的:

array([[1, 1, 1, 1],
       [1, 1, 1, 1],
       [0, 0, 1, 1],
       [0, 0, 1, 1]])

也就是说,原数组中每个单元格的值会被复制到结果数组中的 4 个对应单元格里。假设数组的大小和放大倍数都是任意的,最有效的方法是什么呢?

4 个回答

11

scipy.misc.imresize 是一个可以调整图片大小的工具。它也可以用来调整 numpy 数组的大小:

#!/usr/bin/env python

import numpy as np
import scipy.misc

def scale_array(x, new_size):
    min_el = np.min(x)
    max_el = np.max(x)
    y = scipy.misc.imresize(x, new_size, mode='L', interp='nearest')
    y = y / 255 * (max_el - min_el) + min_el
    return y

x = np.array([[1, 1],
              [0, 1]])
n = 2
new_size = n * np.array(x.shape)
y = scale_array(x, new_size)
print(y)
18

你可以使用 repeat 这个功能:

In [6]: a.repeat(2,axis=0).repeat(2,axis=1)
Out[6]: 
array([[1, 1, 1, 1],
       [1, 1, 1, 1],
       [0, 0, 1, 1],
       [0, 0, 1, 1]])

我不太确定有没有什么好的方法可以把这两个操作合并成一个。

73

你应该使用克罗内克积,可以通过numpy.kron来实现:

这个函数计算克罗内克积,它会生成一个由第二个数组的块组成的复合数组,这些块会根据第一个数组进行缩放。

import numpy as np
a = np.array([[1, 1],
              [0, 1]])
n = 2
np.kron(a, np.ones((n,n)))

这样就能得到你想要的结果:

array([[1, 1, 1, 1],
       [1, 1, 1, 1],
       [0, 0, 1, 1],
       [0, 0, 1, 1]])

撰写回答