numpy 배열에서 특정 요소를 제거하는 방법
numpy 배열에서 특정 요소를 어떻게 제거 할 수 있습니까? 내가 가지고 있다고
import numpy as np
a = np.array([1,2,3,4,5,6,7,8,9])
그때 제거 할 3,4,7
에서 a
. 내가 아는 것은 값의 색인입니다 ( index=[2,3,6]
).
numpy.delete () 사용 - 삭제 된 축을 따라 하위 배열이 있는 새 배열을 반환합니다.
numpy.delete(a, index)
특정 질문에 대해 :
import numpy as np
a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
index = [2, 3, 6]
new_a = np.delete(a, index)
print(new_a) #Prints `[1, 2, 5, 6, 8, 9]`
배열 스칼라 는 파이썬의 문자열과 유사하게 변경할 수 없으므로 numpy.delete()
새 배열 을 반환 하므로 변경 할 때마다 새 객체가 생성됩니다. 즉, 문서 를 인용하려면 :delete()
" obj에 지정된 요소가 제거 된 arr 의 사본 이 삭제 되었습니다. 삭제는 제자리에서 발생하지 않습니다 ."
내가 게시 한 코드에 출력이 있으면 코드를 실행 한 결과입니다.
이를 돕기 위해 수많은 내장 함수가 있습니다.
import numpy as np
>>> a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> b = np.array([3,4,7])
>>> c = np.setdiff1d(a,b)
>>> c
array([1, 2, 5, 6, 8, 9])
Numpy 배열은 변경할 수 없으므로 기술적으로 항목을 삭제할 수 없습니다. 그러나 원하지 않는 값없이 다음과 같이 새 배열을 구성 할 수 있습니다 .
b = np.delete(a, [2,3,6])
값으로 삭제하려면 :
modified_array = np.delete(original_array, np.where(original_array == value_to_delete))
멍청한 사람이 아닌 나는 총을 맞았습니다.
>>> import numpy as np
>>> import itertools
>>>
>>> a = np.array([1,2,3,4,5,6,7,8,9])
>>> index=[2,3,6]
>>> a = np.array(list(itertools.compress(a, [i not in index for i in range(len(a))])))
>>> a
array([1, 2, 5, 6, 8, 9])
내 테스트에 따르면 성능이 뛰어납니다 numpy.delete()
. 초기 배열의 작은 크기로 인해 왜 그런지 모르겠습니다.
python -m timeit -s "import numpy as np" -s "import itertools" -s "a = np.array([1,2,3,4,5,6,7,8,9])" -s "index=[2,3,6]" "a = np.array(list(itertools.compress(a, [i not in index for i in range(len(a))])))"
100000 loops, best of 3: 12.9 usec per loop
python -m timeit -s "import numpy as np" -s "a = np.array([1,2,3,4,5,6,7,8,9])" -s "index=[2,3,6]" "np.delete(a, index)"
10000 loops, best of 3: 108 usec per loop
그것은 (예상했던 것과 반대 방향으로) 상당히 중요한 차이입니다.이 이유가 무엇인지 아는 사람이 있습니까?
더 이상하게도, numpy.delete()
목록을 전달 하면 목록을 반복하여 단일 인덱스를 제공하는 것보다 성능이 떨어집니다.
python -m timeit -s "import numpy as np" -s "a = np.array([1,2,3,4,5,6,7,8,9])" -s "index=[2,3,6]" "for i in index:" " np.delete(a, i)"
10000 loops, best of 3: 33.8 usec per loop
편집 : 배열의 크기와 관련이있는 것 같습니다. 큰 배열의 경우 numpy.delete()
훨씬 빠릅니다.
python -m timeit -s "import numpy as np" -s "import itertools" -s "a = np.array(list(range(10000)))" -s "index=[i for i in range(10000) if i % 2 == 0]" "a = np.array(list(itertools.compress(a, [i not in index for i in range(len(a))])))"
10 loops, best of 3: 200 msec per loop
python -m timeit -s "import numpy as np" -s "a = np.array(list(range(10000)))" -s "index=[i for i in range(10000) if i % 2 == 0]" "np.delete(a, index)"
1000 loops, best of 3: 1.68 msec per loop
분명히, 당신은 항상 명확성을 위해 가고 바퀴를 재발 명하지 않아야하기 때문에 이것은 모두 관련이 없습니다. 그러나 나는 조금 흥미 롭다는 것을 알았습니다.
색인을 모르면 사용할 수 없습니다 logical_and
x = 10*np.random.randn(1,100)
low = 5
high = 27
x[0,np.logical_and(x[0,:]>low,x[0,:]<high)]
특정 인덱스 제거 (매트릭스에서 16과 21을 제거했습니다)
import numpy as np
mat = np.arange(12,26)
a = [4,9]
del_map = np.delete(mat, a)
del_map.reshape(3,4)
산출:
array([[12, 13, 14, 15],
[17, 18, 19, 20],
[22, 23, 24, 25]])
세트를 사용할 수도 있습니다.
a = numpy.array([10, 20, 30, 40, 50, 60, 70, 80, 90])
the_index_list = [2, 3, 6]
the_big_set = set(numpy.arange(len(a)))
the_small_set = set(the_index_list)
the_delta_row_list = list(the_big_set - the_small_set)
a = a[the_delta_row_list]
참고 URL : https://stackoverflow.com/questions/10996140/how-to-remove-specific-elements-in-a-numpy-array
'Programing' 카테고리의 다른 글
매개 변수 선언에서 varchar (MAX)에 어떤 크기를 사용합니까? (0) | 2020.05.21 |
---|---|
EXISTS를 비트로 직접 선택할 수 있습니까? (0) | 2020.05.21 |
Enum이 인터페이스를 구현하는 이유는 무엇입니까? (0) | 2020.05.20 |
Windows 배치 스크립트에서 날짜 및 시간 형식 (0) | 2020.05.20 |
Windows 배치 스크립트에서 날짜 및 시간 형식 (0) | 2020.05.20 |