如何在Python中扩展一个二维数组?

4

我不确定如何对二维数组进行缩放。假设我有下面这个8x10的数组,现在需要将它缩放到5x6 -- 我在维基百科上找了一些具体的例子,但是由于我对矩阵数学没有很好的基础知识,有点迷惑。如果有人能为我指点迷津,我会非常感激!

[
 [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
当你提到“缩放”时,你具体指的是什么?把它看作一张图片? - configurator
缩放在矩阵中有着特定的含义(即特定的仿射变换),它并不改变矩阵的大小。因此,我猜想你在这里指的是其他东西,但不清楚具体指的是什么。 - Adrian Petrescu
是的,把它当作一张图片来处理。我认为这就是我找不到解决方案的问题所在,因为矩阵变换似乎有些不同。我希望在任意缩小或放大的同时“保留”其中包含的数据。 - coleifer
2个回答

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))

然后新图像是

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模式。


为什么要使用Scipy,直接使用PIL更合理呢? - martineau
哇,我完全想到了直接使用PIL可能会有一些技巧可言,但也许这是最好的方法。 - coleifer
@martineau,也许是因为你想在scipy中再次使用结果?这是我的想法。 - Justin Peel

2

当有疑问时,使用库!

PIL拥有调整图像大小的函数,假设这就是您所需要的缩放类型。要将您的嵌套列表转换为PIL图像,请先将其转换为numpy数组,然后转换为PIL格式。完成后,如果确实需要,可以反向操作以获得嵌套列表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接