2017-07-11 62 views
3

我有以下陣列:擴大/縮放在numpy的陣列

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,或任何變焦倍數是要的,但目前它是陣列中的每個元素不同。

有沒有直接的方法來做到這一點?或者我應該手動進行一些編碼?

回答

5

也許有一點,但是對於completness的緣故: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.]]) 
+0

永不遲到!公平地說,這個答案比@MSeifert的答案更完整和更容易實現。這個答案完美適用於2D陣列,然而,我發現在我的3D陣列上應用它時遇到了困難。 關於您的答案的另一個好處是您可以分別確定每個維度上的展開值,並且這種情況下您不希望以相同的值向所有方向展開數組。 現在我肯定會說:這是答案。 – philippos

+0

你可以指定或給出一個例子你的意思是「我發現在我的3D陣列上應用它有困難」? –

1

我不知道是否有這不正是你在與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]]) 

我還沒有測試過所有的因素和形狀,也許這種方法可能會因爲浮點精度(片中的step參數)而有麻煩。晚

+1

這正是我想要的!謝謝。我仍然不熟悉'slice'和'np.ngrid',所以我會根據我目前的知識以完全不同的方式解決它,但是你的函數完全符合我的要求。我測試了它的非正方形,浮動陣列,它的工作完美。 – philippos