HOWTO · NumPy
Python에서 Numpy 배열의 행 반복
이 튜토리얼에서는 Python에서 NumPy 배열의 행을 반복하는 방법에 대해 설명합니다.
이 페이지의 내용
NumPy는 Python에서 수치 연산을 위한 초석 라이브러리로, 특히 과학 컴퓨팅과 데이터 조작 분야에서 개발자가 배열을 원활하게 다룰 수 있게 해줍니다. 다차원 배열을 다룰 때 행을 반복하는 능력은 기본적인 기술입니다.
이 글에서는 Python에서 NumPy 배열의 행을 효율적으로 반복하는 다양한 방법과 기법을 살펴보겠습니다.
for 루프를 사용하여 Python에서 NumPy 배열의 행과 각 행 안의 요소를 반복하기
시작하기 위해 NumPy 라이브러리를 np로 가져오고 np.array 함수를 사용하여 my_array라는 이름의 2D NumPy 배열을 만듭니다. 대괄호로 표시되는 이 배열은 3개의 행과 3개의 열을 가진 행렬을 나타냅니다.
import numpy as np
# Create a 2D NumPy array
my_array = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
for 루프를 사용하여 NumPy 배열의 행을 반복하는 것은 일반적이고 직관적인 접근 방식입니다. for 루프를 사용하면 각 행을 손쉽게 반복할 수 있습니다.
제공된 예에서는 for 루프를 사용하여 my_array의 각 행을 반복하고 각 행의 내용을 출력합니다.
import numpy as np
# Create a 2D NumPy array
my_array = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# Iterate over rows using a for loop
for row in my_array:
print(row)
for 루프는 배열의 각 행을 반복하며, 각 반복마다 변수 row는 배열의 단일 행을 나타냅니다. print(row) 문은 각 행의 내용을 출력합니다.
단일 루프는 행 전체를 제공합니다. 이는 2차원 배열을 반복하면 그 1차원 부분 배열이 생성되기 때문입니다. 각 행 안의 개별 요소가 필요할 때는 첫 번째 루프 안에 두 번째 루프를 중첩합니다:
import numpy as np
# Create a 2D NumPy array
my_array = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# Iterate over the elements within each row using a nested for loop
for row in my_array:
for cell in row:
print(cell)
안쪽 루프는 현재 행의 요소마다 한 번씩 실행되므로, 9개의 요소가 한 줄에 하나씩 출력됩니다:
1
2
3
4
5
6
7
8
9
예제 출력은 반복에 for 루프를 사용하는 것의 단순함을 보여줍니다.
[1 2 3]
[4 5 6]
[7 8 9]
for 루프와 flatten() 함수를 사용하여 Python에서 NumPy 배열의 요소를 반복하기
for 루프와 flatten() 함수를 결합하면 NumPy 배열의 요소를 반복하는 대안적인 접근 방식을 얻을 수 있습니다.
NumPy의 flatten() 함수는 모든 차원을 접어 배열의 1차원 복사본을 반환하는 메서드입니다. 이는 for 루프를 사용하여 2D 배열의 모든 요소를 순서대로 반복하려는 경우에 특히 유용합니다.
flatten() 함수의 구문은 다음과 같습니다:
numpy_array.flatten(order="C")
numpy_array: 평탄화할 배열.order: (선택 사항) 배열 요소가 평탄화되는 순서.C(행 우선, 기본값) 또는F(열 우선)가 될 수 있습니다.
예를 살펴보겠습니다:
import numpy as np
# Create a 2D NumPy array
my_array = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# Iterate over rows using a for loop and flatten()
for cell in my_array.flatten():
print(cell, end=" ")
출력:
1 2 3 4 5 6 7 8 9
먼저, np.array() 함수를 사용하여 my_array라는 2D 배열을 만듭니다. 이 배열에는 3개의 행과 3개의 열을 가진 행렬로 조직된 값이 들어 있습니다.
배열의 각 요소를 더 순차적인 방식으로 살펴보고자 합니다. 그래서 flatten() 함수를 배열에 적용한 후 for 루프를 사용하여 배열의 요소를 반복합니다.
flatten() 함수는 본질적으로 우리의 2D 배열을 더 단순한 1차원 배열로 변환하여 순회하기 쉽게 만듭니다.
루프 안에서는 각 반복마다 변수 cell이 현재 요소의 값을 취합니다. 그런 다음 그 요소를 출력하고 공백을 뒤에 붙입니다.
print 문의 end=" " 부분은 요소들이 사이에 공백을 두고 같은 줄에 출력되도록 보장합니다. 이 코드를 실행하면 2D 배열의 모든 요소가 깔끔한 한 줄로 나타나며, for 루프와 flatten() 함수를 사용하여 요소를 반복하는 편리한 방법이 됩니다.
apply_along_axis() 함수를 사용하여 Python에서 NumPy 배열의 행 반복하기
NumPy의 apply_along_axis() 함수는 배열의 지정된 축을 따라 함수를 적용하는 또 다른 편리한 방법을 제공하여, 행 단위 연산에 효과적인 도구가 됩니다.
그 구문은 다음과 같습니다:
numpy.apply_along_axis(func1d, axis, arr, *args, **kwargs)
매개변수:
func1d: 지정된 축을 따라 적용될 함수.axis: 함수가 적용될 축(열은0, 행은1).arr: 입력 배열.*args및**kwargs: 함수에 전달될 추가 인수 및 키워드 인수.
이제 NumPy 배열에서 행을 반복하기 위해 apply_along_axis()를 사용하는 방법을 보여주는 예를 살펴보겠습니다:
import numpy as np
my_array = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
def row_operation(row):
return row.sum()
result = np.apply_along_axis(row_operation, axis=1, arr=my_array)
print("Result of row-wise operation:", result)
출력:
Result of row-wise operation: [ 6 15 24]
이 예에서는 my_array라는 이름의 2D NumPy 배열을 만듭니다. 그런 다음 행을 입력으로 받아 그 행에 특정 연산을 수행하는 함수 row_operation()을 정의합니다.
이 경우 각 행의 요소 합계를 계산합니다.
다음으로, row_operation 함수를 지정하고, 행 단위 적용을 나타내기 위해 axis=1로 설정하고, 입력으로 배열 my_array를 제공하면서 apply_along_axis() 함수를 사용합니다.
결과는 my_array의 각 행에 row_operation 함수를 적용한 출력을 포함하는 배열입니다. 마지막으로 결과를 출력하여 apply_along_axis()가 행을 효율적으로 반복하는 방법을 보여줍니다.
nditer를 사용하여 Python에서 NumPy 배열의 행 반복하기
nditer 함수는 NumPy 라이브러리의 일부이며 배열의 요소를 효율적으로 반복하도록 설계되었습니다. 반복 과정을 사용자 지정할 수 있는 다양한 메서드와 옵션을 제공합니다.
nditer의 구문은 다음과 같습니다:
numpy.nditer(
op,
flags=["readwrite"],
op_flags=None,
op_dtypes=None,
order="K",
casting="safe",
buffersize=0,
)
매개변수:
op: 반복할 배열.flags: 이터레이터의 동작을 수정하는 플래그 목록(기본값은readwrite).op_flags: 각 피연산자에 대한 추가 플래그(해당하는 경우).op_dtypes: 피연산자 데이터 타입의 목록(해당하는 경우).order: 이터레이터가 배열을 순회할 순서(C는 C 스타일,F는 Fortran 스타일,K는 순서 유지).casting: 암시적 타입 캐스팅에 대한 캐스팅 규칙을 지정합니다.buffersize: 최적화를 위한 버퍼의 크기.
이제 실용적인 예로 NumPy 배열에서 행을 반복하기 위해 nditer를 사용하는 방법을 설명하겠습니다:
import numpy as np
my_array = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
with np.nditer(my_array, flags=["multi_index"], op_flags=["readwrite"]) as it:
for row_index in it:
row_data = my_array[it.multi_index[0], :]
print(f"Row {it.multi_index[0] + 1}: {row_data}")
출력:
Row 1: [1 2 3]
Row 1: [1 2 3]
Row 1: [1 2 3]
Row 2: [4 5 6]
Row 2: [4 5 6]
Row 2: [4 5 6]
Row 3: [7 8 9]
Row 3: [7 8 9]
Row 3: [7 8 9]
이 예에서는 먼저 my_array라는 이름의 2D NumPy 배열을 만듭니다. 행을 반복하기 위해 'multi_index' 플래그와 함께 nditer 함수를 사용하여 반복 중 멀티 인덱스를 추적하고자 함을 나타냅니다.
루프 안에서 it.multi_index[0]은 현재 행 인덱스를 제공하며, 우리는 이 인덱스를 사용하여 그 행을 따라 배열의 요소에 접근합니다.
이 경우 row_data는 현재 행의 요소를 나타냅니다.
루프 안에서 어떤 행 단위 연산도 수행할 수 있어, nditer는 특정 요구에 따라 반복 과정을 사용자 지정할 수 있는 다재다능한 도구가 됩니다.
enumerate와 ndenumerate를 사용하여 Python에서 NumPy 배열의 행 반복하기
위에서 논의한 방법 외에도, 내장 함수 enumerate와 ndenumerate를 for 루프와 결합하여 NumPy 배열의 행을 반복하는 데 사용할 수도 있습니다.
for 루프와 함께 enumerate 사용하기
Python의 enumerate 함수는 이터러블의 요소의 인덱스와 값을 모두 얻을 수 있는 다재다능한 도구입니다. for 루프와 결합하면 NumPy 배열의 행을 반복하는 편리한 방법이 됩니다.
예는 다음과 같습니다:
import numpy as np
my_array = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
for row_index, row_data in enumerate(my_array):
print(f"Row {row_index + 1}: {row_data}")
출력:
Row 1: [1 2 3]
Row 2: [4 5 6]
Row 3: [7 8 9]
이 예에서 enumerate(my_array)는 행 인덱스(row_index)와 해당 행 데이터(row_data)의 쌍을 반환합니다. 그런 다음 for 루프는 이 쌍들을 반복하여 각 행과 그 인덱스에 접근하고 출력할 수 있게 합니다.
for 루프와 함께 ndenumerate 사용하기
NumPy는 다차원 배열의 요소와 그 인덱스를 반복하기 위해 특별히 설계된 ndenumerate 함수를 제공합니다. 이를 사용하여 행을 반복하는 방법은 다음과 같습니다:
import numpy as np
my_array = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
for index, value in np.ndenumerate(my_array):
row_index = index[0]
if index[1] == 0:
print(f"Row {row_index + 1}: {my_array[row_index, :]}", end=" ")
출력:
Row 1: [1 2 3] Row 2: [4 5 6] Row 3: [7 8 9]
이 예에서 np.ndenumerate(my_array)는 인덱스(index)와 해당 값(value)의 쌍을 반환합니다. 루프는 이 쌍들을 반복하며, 우리는 첫 번째 인덱스(index[0])를 사용하여 행 인덱스를 식별합니다.
값을 출력하되, 두 번째 인덱스(index[1])가 0인지 확인하여 그것이 각 행의 값에 속하는지 보장합니다.
두 방법 모두 NumPy 배열의 행을 반복하는 효과적인 방법을 제공합니다. enumerate 방법은 간결하고 파이썬다운 접근 방식을 제공하며, NumPy의 ndenumerate는 특히 다차원 배열에서 반복 과정에 대한 더 많은 제어권을 제공합니다.
결론
NumPy 배열의 행을 반복하는 것은 Python으로 데이터를 다루는 모든 사람에게 기본적인 기술입니다. 이 글에서 논의한 방법들은 특정 요구에 따라 선택할 수 있는 포괄적인 도구 세트를 제공합니다.
for 루프의 단순함, nditer의 효율성, 또는 enumerate와 ndenumerate의 유연성 중 무엇이든, 이러한 기술을 익히면 배열 조작 능력이 틀림없이 향상되고 견고한 Python 애플리케이션 개발에 기여할 것입니다.