2013-03-06 3 views
0

동시에 다차원 배열을 슬라이스하고 반복하려고합니다. 나는 기능적인 솔루션을 가지고 있지만,보기 흉한 일이며, 내가 알지 못하는 반복과 슬라이스를하는 매끄러운 방법이 있다고 생각한다. y가 정의 된 모양이 없기 때문에,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

답변

4

귀하의 마지막 모양 변경이 작동하지 않습니다 여기에 코드입니다. 그게 없으면 당신이 얻을 :

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

아직도 더 쉽게 읽을 수 있다고 말할 수는 없습니다. (또는 최소 통화로 임시 전화를 걸 때마다 효율적입니다.) 참고 y의 요소를 찾으려고했기 때문에 제 대답이 Jaime's과 다릅니다. minmax으로 바꿀 수 있습니다.