2016-07-22 2 views
1

numpy 슬라이싱 예. S=np.s_[1:-1]; V=A[1:-1]은 기본 배열의 뷰를 생성합니다. 이 기본 배열을 V.base으로 찾을 수 있습니다. 그러한 견해를 함수에 전달하면 (예 :함수에 ndarray 뷰를 전달하면 해당베이스를 찾을 수 있지만 어떻게 슬라이스를 찾을 수 있습니까?

def f(x): 
    return x.base 

다음에 f(V) == A. 그러나 어떻게 슬라이스 정보 S을 찾을 수 있습니까? 이보기를 만든 슬라이스에 대한 정보가 들어있는 base과 같은 속성을 찾고 있습니다. 배열의 뷰를 전달하고 뷰에서 계산 된 동일한 배열의 다른 뷰를 반환 할 수있는 함수를 작성하고 싶습니다. 예 : 보기를 1 차원 배열의 오른쪽 또는 왼쪽으로 이동할 수 있어야합니다.

답변

1

내가 아는 한 슬라이스 정보는 어디에도 저장되어 있지 않지만 뷰와 기반의 속성에서 추론 할 수 있습니다. 예를 들어

는 :

In [156]: x=np.arange(10) 
In [157]: y=x[3:] 
In [159]: y.base 
Out[159]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 

In [160]: y.data 
Out[160]: <memory at 0xb1a16b8c> 
In [161]: y.base.data 
Out[161]: <memory at 0xb1a16bf4> 

나는 __array_interface__ 값이 더 좋아 :

In [162]: y.__array_interface__['data'] 
Out[162]: (163056924, False) 
In [163]: y.base.__array_interface__['data'] 
Out[163]: (163056912, False) 

그래서 yx 이상 12 바이트를 시작하는 DataBuffer. y.itemsize은 4이므로 슬라이스 시작은 3입니다.

In [164]: y.shape 
Out[164]: (7,) 
In [165]: x.shape 
Out[165]: (10,) 

는 그리고 모양을 비교, 나는 슬라이스 정지 None (끝)임을 추론.

2 차원 어레이 또는 계단식 슬라이스의 경우 strides도 살펴 봐야합니다.

실제로는 결과에서 추론하는 것이 아니라 슬라이싱 객체 (튜플, 슬라이스 등)를 함수에 전달하는 것이 더 쉽고 안전합니다.

In [173]: S=np.s_[1:-1] 
In [174]: S 
Out[174]: slice(1, -1, None) 
In [175]: x[S] 
Out[175]: array([1, 2, 3, 4, 5, 6, 7, 8]) 

즉, 추론하기보다는 S을 전달하십시오. 나는 전에 그것을 한 번도 본 적이 없다.

+0

나는 S를 지나쳐 목적을 달성 할 수 있다고 생각하지만, 당신은 1d에서 다소 직관적 인 5 행 솔루션을 위해 필요한 것을 제공했다. 이 조각의 사용이 실제로 numpy에서 예기되지 않은 경우에 나에게 이상하게 보입니다. –

관련 문제