2013-03-06 243 views
0

我想切片並在同一時間迭代多維數組。我有一個功能性的解決方案,但它有點難看,我敢打賭,有一種很好的方法可以做迭代和切片,但我不知道。下面的代碼:numpy ndarray切片和迭代

import numpy as np 
x = np.arange(64).reshape(4,4,4) 
y = [x[i:i+2,j:j+2,k:k+2] for i in range(0,4,2) 
          for j in range(0,4,2) 
          for k in range(0,4,2)] 
y = np.array(y) 
z = np.array([np.min(u) for u in y]).reshape(y.shape[1:]) 
+2

你能否修正你的代碼中的錯誤,以便它實際上起作用?謝謝。 – NPE 2013-03-06 18:02:40

回答

4

你最後重塑不起作用,因爲y不具有確定的形狀。沒有它,你會得到:

>>> x = np.arange(64).reshape(4,4,4) 
>>> y = [x[i:i+2,j:j+2,k:k+2] for i in range(0,4,2) 
...       for j in range(0,4,2) 
...       for k in range(0,4,2)] 
>>> z = np.array([np.min(u) for u in y]) 
>>> z 
array([ 0, 2, 8, 10, 32, 34, 40, 42]) 

但儘管如此,你可能要重塑您的陣列6米的尺寸,這可以讓你與上面相同的結果是什麼:

>>> xx = x.reshape(2, 2, 2, 2, 2, 2) 
>>> zz = xx.min(axis=-1).min(axis=-2).min(axis=-3) 
>>> zz 
array([[[ 0, 2], 
     [ 8, 10]], 

     [[32, 34], 
     [40, 42]]]) 
>>> zz.ravel() 
array([ 0, 2, 8, 10, 32, 34, 40, 42]) 
0

這很難說,到底是什麼你想要最後的意思,但你可以使用stride_tricks來獲得一個「閃爍」的方式。這相當棘手。

import numpy.lib.stride_tricks 

# This returns a view with custom strides, x2[i,j,k] matches y[4*i+2*j+k] 
x2 = numpy.lib.stride_tricks(
     x, shape=(2,2,2,2,2,2), 
     strides=(numpy.array([32,8,2,16,4,1])*x.dtype.itemsize)) 

z2 = z2.min(axis=-1).min(axis=-2).min(axis=-3) 

不過,我不能說這是更可讀。 (或者高效,因爲每個分鐘電話都會臨時撥號。)

請注意,我的答案與Jaime's不同,因爲我試圖匹配您的y元素。你可以告訴你是否用max代替min