如何在Python中缩放二维数组?

4 投票
2 回答
12708 浏览
提问于 2025-04-16 08:33

我不太确定怎么去缩放一个二维数组。比如说,下面这个数组的大小是8行10列,如果我想把它缩放到5行6列——我在维基百科上找了一些具体的例子,但因为我对矩阵数学不太了解,所以有点迷茫。如果有人能给我指个方向,我会非常感激!

[
 [0, 0, 1, 1, 1, 1, 0, 0],
 [0, 1, 1, 1, 1, 1, 1, 0],
 [0, 1, 0, 0, 0, 1, 1, 1],
 [0, 0, 0, 0, 0, 0, 1, 1],
 [0, 0, 1, 1, 1, 1, 1, 1],
 [1, 1, 1, 1, 1, 1, 1, 1],
 [1, 1, 0, 0, 0, 0, 1, 1],
 [1, 1, 0, 0, 0, 1, 1, 1],
 [1, 1, 1, 1, 1, 1, 1, 1],
 [0, 1, 1, 1, 1, 0, 1, 1]
]

2 个回答

2

有疑问的时候,使用库函数是个好主意!

PIL 提供了调整图片大小的功能,假设你想要的就是这种缩放方式。要把你的列表转换成PIL图片,首先需要把它转换成一个numpy数组,然后再转换成PIL格式。完成后,如果你真的想的话,还可以把这个过程反过来,得到一个列表。

10

因为你的数组看起来像是小写字母'a'的二进制图像,所以我猜你是想在图像的意义上进行缩放。

为了实现这个,我建议你使用scipy.misc中的imresize函数(我相信这个函数是从PIL库中来的)。下面是一个例子:

import numpy as np
from scipy.misc import imresize

img = np.array([
 [0, 0, 1, 1, 1, 1, 0, 0],
 [0, 1, 1, 1, 1, 1, 1, 0],
 [0, 1, 0, 0, 0, 1, 1, 1],
 [0, 0, 0, 0, 0, 0, 1, 1],
 [0, 0, 1, 1, 1, 1, 1, 1],
 [1, 1, 1, 1, 1, 1, 1, 1],
 [1, 1, 0, 0, 0, 0, 1, 1],
 [1, 1, 0, 0, 0, 1, 1, 1],
 [1, 1, 1, 1, 1, 1, 1, 1],
 [0, 1, 1, 1, 1, 0, 1, 1]
])
newimg = imresize(img, (6,5))

然后newimg就是

array([[  0,   0, 255, 255,   0],
       [  0, 255, 255, 255, 255],
       [  0,   0,   0,   0, 255],
       [255, 255, 255, 255, 255],
       [255, 255,   0,   0, 255],
       [255, 255, 255, 255, 255]], dtype=uint8)

虽然这不是完美的,但你可以很容易地把255改成1。此外,如果你获取Scipy的开发版本,目前是9版本,那么你可以在imresize中输入一些其他参数(向下滚动到imresize - 没有锚点),比如插值方法和PIL模式。

撰写回答