如何在Python中缩放二维数组?
我不太确定怎么去缩放一个二维数组。比如说,下面这个数组的大小是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模式。