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]
).
Use 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()
배열 스칼라는 Python의 문자열과 마찬가지로 불변이므로 변경할 때마다 새 배열이 생성됩니다.예를 들면,delete()
문서:
obj에 의해 지정된 요소가 제거된 ar의 복사본입니다.삭제는 일괄적으로 이루어지지 않습니다.."
내가 게시한 코드가 출력된 경우 코드를 실행한 결과입니다.
그것을 지원하기 위한 Numpy 기능이 내장되어 있습니다.
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 배열은 변경할 수 없습니다. 즉, Numpy 배열에서 항목을 삭제할 수 없습니다.그러나 다음과 같이 불필요한 값을 사용하지 않고 새 배열을 구성할 수 있습니다.
b = np.delete(a, [2,3,6])
값을 기준으로 삭제하려면:
modified_array = np.delete(original_array, np.where(original_array == value_to_delete))
사용.np.delete
삭제할 요소의 인덱스를 알고 있다면 가장 빠른 방법입니다.단, 완전성을 위해 다음 방법으로 작성된 부울마스크를 사용하여 어레이 요소를 "삭제"하는 방법을 추가합니다.np.isin
이 방법을 사용하면 요소를 직접 지정하거나 인덱스로 요소를 제거할 수 있습니다.
import numpy as np
a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
인덱스로 제거:
indices_to_remove = [2, 3, 6]
a = a[~np.isin(np.arange(a.size), indices_to_remove)]
요소별로 삭제(원본을 다시 만드는 것을 잊지 마십시오)a
이전 행에서 다시 작성되었기 때문에:
elements_to_remove = a[indices_to_remove] # [3, 4, 7]
a = a[~np.isin(a, elements_to_remove)]
무감각한 사람이 아니었기 때문에, 나는 다음과 같이 촬영했다.
>>> 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
확실히 이 모든 것은 전혀 관계가 없습니다.명확성을 추구하여 바퀴를 재창조하는 것을 피해야 합니다만, 조금 흥미롭다고 생각했기 때문에, 여기에 두기로 했습니다.
삭제할 요소의 인덱스가 없는 경우 numpy에서 제공하는 in1d 함수를 사용할 수 있습니다.
함수가 반환되다True
1차원 배열의 요소가 두 번째 배열에도 존재하는 경우.요소를 삭제하려면 이 함수에 의해 반환된 값을 비활성화해야 합니다.
이 방법을 사용하면 원래 배열의 순서가 유지됩니다.
In [1]: import numpy as np
a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
rm = np.array([3, 4, 7])
# np.in1d return true if the element of `a` is in `rm`
idx = np.in1d(a, rm)
idx
Out[1]: array([False, False, True, True, False, False, True, False, False])
In [2]: # Since we want the opposite of what `in1d` gives us,
# you just have to negate the returned value
a[~idx]
Out[2]: array([1, 2, 5, 6, 8, 9])
인덱스를 모르면 사용할 수 없습니다.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 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
index = np.array([2, 3, 6]) #index is changed to an array.
out = [val for i, val in enumerate(a) if all(i != index)]
>>> [1, 2, 5, 6, 8, 9]
다음의 세트를 사용할 수도 있습니다.
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]
불필요한 부품을 필터링 합니다.
import numpy as np
a = np.array([1,2,3,4,5,6,7,8,9])
a = a[(a!=3)&(a!=4)&(a!=7)]
제거할 인덱스 목록이 있는 경우:
to_be_removed_inds = [2,3,6]
a = np.array([1,2,3,4,5,6,7,8,9])
a = a[[x for x in range(len(a)) if x not in to_be_removed]]
언급URL : https://stackoverflow.com/questions/10996140/how-to-remove-specific-elements-in-a-numpy-array
'programing' 카테고리의 다른 글
MySQL, NULL 또는 빈 문자열을 삽입하시겠습니까? (0) | 2022.09.06 |
---|---|
MYSQL 쿼리: 한 열이 여러 다른 그룹에서 여러 번 발생하고 특정 조건과 일치하는 모든 결과를 가져옵니다. (0) | 2022.09.06 |
PHP를 사용하여 HTTP에서 HTTPS로 리디렉션 (0) | 2022.09.06 |
MySQL IFNULL 기타 (0) | 2022.09.05 |
함수를 PHP 배열에 저장할 수 있습니까? (0) | 2022.09.05 |