2017-11-12 3 views
0
import numpy as np 
np.random.seed(5) 
x = np.random.randint(0,10,12) 
# array([3, 6, 6, 0, 9, 8, 4, 7, 0, 0, 7, 1]) 

x의 여러 하위 어레이를 각각 하나의 값 (예 : 평균)으로 대체하려고합니다. 부분 배열 이상 :파이썬 : 배열의 여러 슬라이스를 하나의 값으로 대체하십시오.

# given the start and end indices for THREE subarrays of x 
subary_start, subary_end = np.array([0, 2, 8]), np.array([1, 3, 10]) 
for i, j in zip(subary_start, subary_end): 
    val = np.mean(x[i:j+1]) # avg. over the subarray 
    print(val) 
# 4.5, 3, 2.33 

예상 출력은 array([4.5, 3, 9, 8, 4, 7, 2.33, 1]) 될 것이다.

일반적으로 len(x)은 10 만 개가 될 수 있으며 수백 개의 슬라이스가있을 수 있으므로 효율적인 해결책이 좋습니다.

+1

당신의 솔루션은 작동합니까? – wwii

+0

'np.mean()'이 이미 가장 효율적인 방법으로 구현되었습니다. –

+0

슬라이스의 시작과 인덱스는 항상 별도의 ndarrays에 포함되어 있습니까? – wwii

답변

0
import copy 

def replace_slice(seq, slice_start, slice_end): 

    seq = seq.astype(float) 
    seq_copy = copy.copy(seq) 
    bool_new_seq = np.ones(len(seq_copy), dtype=bool) 

    for i, j in zip(slice_start, slice_end): 
     bool_new_seq[i+1: j+1] = False 
     new_val = np.mean(seq_copy[i: j+1]) 
     seq_copy[i] = new_val 

    new_seq = seq_copy[bool_new_seq] 
    return new_seq 

replace_slice(x, np.array([0, 2, 8]), np.array([1, 3, 10]))이 예상되는 결과를 산출한다. 그러나 긴 시퀀스와 슬라이스 목록에 더 좋은 것이 있는지 확실하지 않습니다.

관련 문제