NumPy 다차원 배열의 i 번째 열에 액세스하는 방법은 무엇입니까?
내가 가지고 있다고 가정 해보십시오.
test = numpy.array([[1, 2], [3, 4], [5, 6]])
test[i]
배열의 i 번째 줄을 얻습니다 (예 :)[1, 2]
. i 번째 열에 어떻게 액세스 할 수 있습니까? (예 :) [1, 3, 5]
. 또한 이것은 비싼 작업입니까?
>>> test[:,0]
array([1, 3, 5])
비슷하게,
>>> test[1,:]
array([3, 4])
행에 액세스 할 수 있습니다. 이것은 NumPy 참조 의 1.4 (인덱싱) 섹션에서 다룹니다 . 적어도 내 경험상 이것은 빠르다. 루프에서 각 요소에 액세스하는 것보다 훨씬 빠릅니다.
한 번에 둘 이상의 열에 액세스하려면 다음을 수행하십시오.
>>> test = np.arange(9).reshape((3,3))
>>> test
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
>>> test[:,[0,2]]
array([[0, 2],
[3, 5],
[6, 8]])
>>> test[:,0]
array([1, 3, 5])
이 명령은 행 벡터를 제공합니다. 루프를 반복하고 싶다면 괜찮습니다. 그러나 차원이 3xN 인 다른 배열로 hstack하고 싶다면
ValueError : 모든 입력 배열의 차원 수가 같아야합니다
동안
>>> test[:,[0]]
array([[1],
[3],
[5]])
연결 또는 hstack 작업을 수행 할 수 있도록 열 벡터를 제공합니다.
예 :
>>> np.hstack((test, test[:,[0]]))
array([[1, 2, 1],
[3, 4, 3],
[5, 6, 5]])
행을 바꾸고 반환 할 수도 있습니다.
In [4]: test.T[0]
Out[4]: array([1, 3, 5])
여러 개의 열을 얻으려면 다음을 수행하십시오.
> test[:,[0,2]]
당신은 열 0과 2를 얻을 것이다
질문에 대한 답변이 있지만 뉘앙스에 대해 언급하겠습니다.
배열의 첫 번째 열에 관심이 있다고 가정 해 봅시다.
arr = numpy.array([[1, 2],
[3, 4],
[5, 6]])
다른 답변에서 이미 알고 있듯이 "행 벡터"(array of shape (3,)
) 형태로 얻으려면 슬라이싱을 사용하십시오.
arr_c1_ref = arr[:, 1] # creates a reference to the 1st column of the arr
arr_c1_copy = arr[:, 1].copy() # creates a copy of the 1st column of the arr
배열이 다른 배열의 뷰인지 또는 사본인지 확인하려면 다음을 수행하십시오.
arr_c1_ref.base is arr # True
arr_c1_copy.base is arr # False
ndarray.base를 참조하십시오 .
둘 사이의 명백한 차이 (수정 arr_c1_ref
은 영향을 미칩니다 arr
) 외에도 각 단계를 통과하는 바이트 단계 수는 다릅니다.
arr_c1_ref.strides[0] # 8 bytes
arr_c1_copy.strides[0] # 4 bytes
보폭을 참조하십시오 . 이것이 왜 중요한가? : A
대신에 매우 큰 배열이 있다고 상상해보십시오 arr
.
A = np.random.randint(2, size=(10000,10000), dtype='int32')
A_c1_ref = A[:, 1]
A_c1_copy = A[:, 1].copy()
첫 번째 열의 모든 요소, 즉 A_c1_ref.sum()
또는 의 합을 계산하려고합니다 A_c1_copy.sum()
. 복사 된 버전을 사용하는 것이 훨씬 빠릅니다.
%timeit A_c1_ref.sum() # ~248 µs
%timeit A_c1_copy.sum() # ~12.8 µs
이것은 앞에서 언급 한 보폭이 다르기 때문입니다.
A_c1_ref.strides[0] # 40000 bytes
A_c1_copy.strides[0] # 4 bytes
열 복사본을 사용하는 것이 더 나은 것처럼 보이지만 복사본을 만드는 데 시간이 걸리고 더 많은 메모리를 사용하는 이유는 항상 사실이 아닙니다 (이 경우을 만드는 데 약 200µs가 걸렸습니다 A_c1_copy
). 그러나 처음에 사본이 필요하거나 배열의 특정 열에서 여러 가지 다른 작업을 수행해야하고 속도를 위해 메모리를 희생하면 복사가 가능합니다.
주로 열을 다루는 데 관심이있는 경우 행 주요 ( 'C') 순서 대신 열-주요 ( 'F') 순서로 배열을 만드는 것이 좋습니다. )을 누른 다음 열을 복사하지 않고 이전과 같이 슬라이싱을 수행하십시오.
A = np.asfortranarray(A) # or np.array(A, order='F')
A_c1_ref = A[:, 1]
A_c1_ref.strides[0] # 4 bytes
%timeit A_c1_ref.sum() # ~12.6 µs vs ~248 µs
이제 열보기에서 합계 작업 (또는 다른 작업)을 수행하는 것이 훨씬 빠릅니다.
마지막으로 배열을 바꾸고 행 슬라이싱을 사용하는 것은 원래 배열의 모양과 보폭을 바꾸는 것만으로 변환되므로 원래 배열의 열 슬라이싱을 사용하는 것과 같습니다.
A.T[1,:].strides[0] # 40000
>>> test
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
>>> ncol = test.shape[1]
>>> ncol
5L
그런 다음이 방법으로 2-4 번째 열을 선택할 수 있습니다.
>>> test[0:, 1:(ncol - 1)]
array([[1, 2, 3],
[6, 7, 8]])
'development' 카테고리의 다른 글
Git 커밋 훅 건너 뛰기 (0) | 2020.02.22 |
---|---|
잘못된 병합을 수정하고 올바른 병합을 고정 병합으로 재생하는 방법은 무엇입니까? (0) | 2020.02.22 |
C에 파일이 있는지 확인하는 가장 좋은 방법은 무엇입니까? (0) | 2020.02.22 |
활성 레코드 레코드를 복제하는 가장 쉬운 방법은 무엇입니까? (0) | 2020.02.22 |
Ruby로 최소 / 최대를 어떻게 찾습니까? (0) | 2020.02.22 |