如何“缩放”numpy数组?
我想把一个形状为 (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]])