관측 시간을 나타내는 float 값 목록이 있습니다. (각 float 값은 실제로 정수로 나타낼 수 있지만 가능한 미래 상황에 대해 일반화하기를 희망합니다.)중복을 포함하는 정렬 된 목록의 비 연속 부동 소수점 요소 사이에 한 개의 0을 어떻게 칠할 수 있습니까?
list_hrs = [4,6,8,8,10] # actual list is thousands of floats
중복 항목이 한 번만 나오는 동안 색인과 일치하지 않는 값을 0으로 채우려고합니다. 예 목록 당, 나는 0
에서 3
에 포괄적으로 네 개의 숫자가 있기 때문에
list_hrs = [0,0,0,0,4,0,6,0,8,8,0,10]
처음 네 개의 항목이 0
입니다하려는 것입니다. 5
이 없기 때문에 0
사이에 4
과 6
이 필요합니다. 마찬가지로 0
은 6
과 8
사이입니다. 값이 9
이므로 0
이 8
과 10
사이에 있어야합니다. 또한, 복제본 8
은 그대로두고 나중에 내 코드에서 다루게 될 것입니다. 0
의 패딩을 수행하기 전에 8
의 복제본을 한 번만 계산해야합니다. 그때 다른 SO 게시물을 읽고 처음 0
's의 목록,있는 길이가해야 할 것이 가장 인상 멀리 온
for index in range(len(list_hrs)):
if list_hrs != index:
list_hrs.insert(index, 0)
>> [0, 0, 0, 0, 0, 4, 6, 8, 8, 10]
:
내 첫 번째 시도는 이것을 시도했다 고려 된 데이터 포인트의 수와 같습니다. 그런 다음 0이 아닌 항목을 0
항목으로 바꿀 수 있습니다.
def make_zeros(hrs=list_hrs): # make list of 0's
num_zer = int(max(hrs))
list_zer = [0 for index in range(num_zer+1)]
return list_zer
하지만이 시점 이후에 원하는 결과를 달성하기 위해 조건을 구현하는 방법이 확실하지 : 그래서, 나는 다음 시도했다. 인덱스가 해당 인덱스의 값과 일치하는지 확인하려면 enumerate
을 사용하는 방법이 있지만 중복 항목 (예 : 위의 예에서 8
)으로 인해 진행 방법이 확실하지 않습니다.
이 방법을 계속 사용할 좋은 방향입니까? 아니면 원하는 결과를 얻으려면보다 효율적이고 간단한 방법이 있습니까? 도움이나 조언을 주시면 감사하겠습니다.
def make_zeros_vectorized(A, dtype=float):
a = np.asarray(A).astype(int)
idx = a + np.r_[0, (a[1:] == a[:-1]).cumsum()]
out = np.zeros(idx[-1]+1,dtype=dtype)
out[idx] = A
return out
샘플 실행 - -
그들은 왜 떠 다니는가, 거기에 10 진수를 기대합니까? '4.2'처럼 말할 수 있을까요? 그렇다면 출력은 어떻게 생겼을 까? – Divakar
또한 입력은 항상 정렬됩니까? – Divakar
각 플로트는 실제로 정수로 해석 될 수 있습니다. 예제 목록은 실제로는 [4.0,6.0,8.0,8.0,10.0]'이어야합니다. 나는 코드를 일반화하기를 희망했다. 그러나 정수의 경우에 대한 해결책이 있다면,이 경우에 잘 작동 할 것입니다. – mikey