2017-05-12 1 views
3

I 배열을 가지고나눈다 NumPy와 배열

이 배열 (이것은에 의존하는 전 과정에서 작성되는, 상기 배열의 길이가 다를 수
a = [1, 3, 5, 7, 29 ... 5030, 6000] 

사용자 입력).

는 또한 배열을 가지고 :

(도 완전히 다를 수 있습니다)
b = [3, 15, 67, 78, 138] 

내가 여러 배열로 배열 a 슬라이스를 배열 b를 사용하고 싶습니다.

은보다 구체적으로, 나는 결과 배열이 원하는 : n = len(b)

array1 = a[:3] 
array2 = a[3:15] 
... 
arrayn = a[138:] 

합니다.

첫 번째 생각은 치수가 (len(b), something) 인 2D 배열 slices을 작성하는 것이 었습니다. 그러나 우리는이 something을 미리 모르기 때문에 값을 len(a)으로 지정 했으므로 포함 할 수있는 최대 숫자입니다.

이 코드가 있습니다

slices = np.zeros((len(b), len(a))) 

for i in range(1, len(b)): 
    slices[i] = a[b[i-1]:b[i]] 

을하지만이 오류 얻을 :

ValueError: could not broadcast input array from shape (518) into shape (2253412) 
+1

나는 중복 된 질문을 찾을 수 없다는 것에 놀랐습니다. 잘 했어! –

답변

5

사용할 수 numpy.split :

np.split(a, b) 

:

,691을
np.split(np.arange(10), [3,5]) 
# [array([0, 1, 2]), array([3, 4]), array([5, 6, 7, 8, 9])] 
2
b.insert(0,0) 
result = [] 
for i in range(1,len(b)): 
    sub_list = a[b[i-1]:b[i]] 
    result.append(sub_list) 
result.append(a[b[-1]:]) 
+0

이것은 본질적으로'np.split'이하는 일이며, 다른 축을 분할 할 수 있도록 약간의 애교 발놀림이 있습니다. – hpaulj

2

비정형 배열을 만들려고하기 때문에 오류가 발생합니다. 이것은 numpy에서는 허용되지 않습니다.

@의 Bohdan의 대답에 개선 :

from itertools import zip_longest 
result = [a[start:end] for start, end in zip_longest(np.r_[0, b], b)] 

트릭은 여기 zip_longest 마지막 조각은 마지막 요소의 특수 처리에 대한 필요성을 제거, b[-1]에서 a[b[-1]:]에 해당 None로 이동합니다 것입니다 .

선택하지 마십시오. 이것은 내가 재미로 추가 한 것입니다. "올바른"대답은 @ Psidom의 대답입니다.

+0

고맙습니다 (간결함을 위해'np.r_' 사용) 고 numpy 청동 배지 (귀하의 upvote라고 가정)에 감사드립니다 :) –

+0

하하. 천만에요. 배지 축하해. – Psidom