2013-03-20 4 views
2

배열어레이에서 여러 슬라이스를 효율적으로 선택하는 방법은 무엇입니까?

d = np.random.randn(100) 

및 인덱스 배열을 감안할 때

i = np.random.random_integers(low=3, high=d.size - 5, size=20) 
I 효율적으로 2 차원 배열 r을 만드는 방법을

r.shape = (20, 8) 

등 모든 j=0..19를 들어,

r[j] = d[i[j]-3:i[j]+5] 

필자의 경우 배열은 매우 큽니다 (100 및 20 대신 ~ 200000). 따라서 어떤 것이 유용 할 것입니다.

+0

'낮음'과 '높음'은 어떤 차이가 있습니까? 'low = 0, high = d.size - 8' 및'd [i [j] : i [j] +8]'와 같이? – Kabie

+0

예, 차이가 있습니다. 'i'의 원소가'<3'이면'i [j] -3'는 음수입니다. 상한과 비슷하다. –

+0

그러나'all (0 <= elem <= elem의 i에 대한 92)가 True이면'd [i [j] : i [j] +8]'는 동일 할 것입니다. – Kabie

답변

1

당신은 데이터의 윈도 윙보기를 만들 수 있습니다 즉, 항목 [i, j] 같이, 원래 배열의 항목 [i+j]하는 (93, 8) 배열 :

>>> from numpy.lib.stride_tricks import as_strided 
>>> wd = as_strided(d, shape=(len(d)-8+1, 8), strides=d.strides*2) 

할 수 있습니다 지금과 같이 원하는 조각을 추출 :

>>> r = wd[i-3] 

wd은 단순히 원래 데이터를 볼 뿐이므로 추가 메모리가 필요하지 않습니다. 임의의 인덱스를 사용하여 r을 추출하면 데이터가 복사됩니다. 따라서 r 배열을 어떻게 사용 하느냐에 따라 가능한 한 많이 지연 시키거나 전체적으로 사용하지 않아도됩니다. 행 r[j]에 항상 wd[j-3]으로 액세스 할 수 있으며 복사본을 트리거하지 않습니다.

+1

먼저 함수를 다시 작성하지 않는 한 여기에서 테이크를 사용하지 마십시오. 그 걸음 걸이를 알고있는 그 위대함은 더 빠르다. 그러나 적어도 일반적으로 매우 나쁜 생각이다. – seberg

+0

@seberg 나는 그것을 복사하고있는 것으로 추측하고있다. 그것은 무엇이든지 상관없이 일어난다. 그것이 나쁜 생각이 든다. 그렇지? 내 대답을 편집 할 것입니다 : 감사합니다! – Jaime

+0

글쎄, 정상적인 슬라이싱은 내가 믿는 임시 복사본을 만들지 않을 것입니다. 그래서 당신이 단지 몇 가지 아이템을 가지고 있다면, 당신은 큰 시간 동안 기억을 부 풀릴 수 있습니다 ... – seberg

관련 문제