scipy 在numpy数组中展开/缩放

ehxuflar  于 2022-11-10  发布在  其他
关注(0)|答案(3)|浏览(180)

我有下面的数组:

import numpy as np
a = np.array([[2, 3, 5],
              [4, 6, 7],
              [1, 5, 7]])

我想把它扩展到这个数组:

b = [[2 2 2 3 3 3 5 5 5]
     [2 2 2 3 3 3 5 5 5]
     [2 2 2 3 3 3 5 5 5]
     [4 4 4 6 6 6 7 7 7]
     [4 4 4 6 6 6 7 7 7]
     [4 4 4 6 6 6 7 7 7]
     [1 1 1 5 5 5 7 7 7]
     [1 1 1 5 5 5 7 7 7]
     [1 1 1 5 5 5 7 7 7]]

因此,我使用以下命令:

import scipy.ndimage
b = scipy.ndimage.interpolation.zoom(a, 3, order=0)

基于这个问题和答案Resampling a numpy array representing an image
然而,我得到的是:

b = [[2 2 3 3 3 3 5 5 5]
     [2 2 3 3 3 3 5 5 5]
     [4 4 6 6 6 6 7 7 7]
     [4 4 6 6 6 6 7 7 7]
     [4 4 6 6 6 6 7 7 7]
     [4 4 6 6 6 6 7 7 7]
     [1 1 5 5 5 5 7 7 7]
     [1 1 5 5 5 5 7 7 7]
     [1 1 5 5 5 5 7 7 7]]

我希望放大倍数正好是3,或者不管放大倍数是多少,但是目前数组的每个元素都是不同的。
有没有直接的方法可以做到这一点?或者我应该手动做一些编码?

n53p2ov0

n53p2ov01#

也许有点晚了,但为了完整起见:Numpy Kron完美地完成了这项工作

>>> import numpy as np
>>> a = np.array([[2,3,5], [4,6,7], [1,5,7]])
>>> np.kron(a, np.ones((3,3)))
array([[ 2.,  2.,  2.,  3.,  3.,  3.,  5.,  5.,  5.],
       [ 2.,  2.,  2.,  3.,  3.,  3.,  5.,  5.,  5.],
       [ 2.,  2.,  2.,  3.,  3.,  3.,  5.,  5.,  5.],
       [ 4.,  4.,  4.,  6.,  6.,  6.,  7.,  7.,  7.],
       [ 4.,  4.,  4.,  6.,  6.,  6.,  7.,  7.,  7.],
       [ 4.,  4.,  4.,  6.,  6.,  6.,  7.,  7.,  7.],
       [ 1.,  1.,  1.,  5.,  5.,  5.,  7.,  7.,  7.],
       [ 1.,  1.,  1.,  5.,  5.,  5.,  7.,  7.,  7.],
       [ 1.,  1.,  1.,  5.,  5.,  5.,  7.,  7.,  7.]])
67up9zun

67up9zun2#

我不知道NumPy或SciPy中是否有一个函数能完全满足你的需求,但你自己创建一个很容易:

from __future__ import division
import numpy as np

def zoom(a, factor):
    a = np.asarray(a)
    slices = [slice(0, old, 1/factor) for old in a.shape]
    idxs = (np.mgrid[slices]).astype('i')
    return a[tuple(idxs)]

它给出了预期结果:

>>> a = [[2,3,5], [4,6,7], [1,5,7]]

>>> zoom(a,3)
array([[2, 2, 2, 3, 3, 3, 5, 5, 5],
       [2, 2, 2, 3, 3, 3, 5, 5, 5],
       [2, 2, 2, 3, 3, 3, 5, 5, 5],
       [4, 4, 4, 6, 6, 6, 7, 7, 7],
       [4, 4, 4, 6, 6, 6, 7, 7, 7],
       [4, 4, 4, 6, 6, 6, 7, 7, 7],
       [1, 1, 1, 5, 5, 5, 7, 7, 7],
       [1, 1, 1, 5, 5, 5, 7, 7, 7],
       [1, 1, 1, 5, 5, 5, 7, 7, 7]])

我还没有测试它的所有因素和形状,也许这种方法可能会有麻烦,因为浮点精度(在切片的步骤参数)。

bakd9h0s

bakd9h0s3#

下面是我的方法,它使用简单的numpy函数,返回与输入相同的dtype。

import numpy as np

def zoom(a, factor):
    sx, sy = (factor * dim for dim in a.shape)
    X, Y = np.ogrid[0:sx, 0:sy]
    return a[X//factor, Y//factor]

相关问题