카테고리 없음

넘파이 배열과 매트릭스의 차이점은 무엇인가요? 어느 것을 사용해야 하나요?

스택큐힙리스트 2023. 3. 31. 07:20
반응형

각각의 장단점은 무엇인가요?

내가 본 바로는 필요한 경우 양쪽 중 하나를 대체로 사용할 수 있습니다. 그래서 둘 다 사용할 필요가 있을까요, 아니면 하나만 사용하는 것이 좋을까요?

프로그램의 스타일이 내 선택에 영향을 미치나요? 나는 넘파이를 사용하여 머신러닝을 하고 있으므로, 정말 많은 행렬이 있지만 많은 벡터(배열)도 있습니다.

답변 1

Numpy 행렬은 엄격하게 2차원이며, numpy 배열(ndarrays)은 N-차원입니다. 행렬 개체는 ndarray의 하위 클래스이므로 모든 속성과 메소드를 상속합니다.

넘파이 행렬의 주요 장점은 행렬 곱을 편리하게 나타낼 수 있다는 것입니다. 만약 a와 b가 행렬이라면, a*b는 그들의 행렬 곱입니다.

import numpy as np

a = np.mat('4 3; 2 1')

b = np.mat('1 2; 3 4')

print(a)

# [[4 3]

# [2 1]]

print(b)

# [[1 2]

# [3 4]]

print(a*b)

# [[13 20]

# [ 5 8]]

한편, Python 3.5부터 NumPy는 @ 연산자를 사용하여 중위 행렬 곱셈을 지원합니다. 따라서 Python >= 3.5에서 ndarrays로 행렬 곱셈의 편의성을 동일하게 얻을 수 있습니다.

import numpy as np

a = np.array([[4, 3], [2, 1]])

b = np.array([[1, 2], [3, 4]])

print(a@b)

# [[13 20]

# [ 5 8]]

행렬 객체와 ndarrays 모두 전치를 반환하는 데 .T를 사용하지만, 행렬 객체는 공액 전치를 반환하는 데 .H를 사용하고 역행렬을 반환하는 데 .I를 사용합니다.

그러나 대조적으로 numpy 배열은 일관적으로 연산이 요소별로 적용된다는 규칙을 준수합니다 (새로운 @ 연산자를 제외하고). 따라서, 만약 a와 b가 numpy 배열이라면, a*b는 구성 요소를 요소별로 곱해서 형성된 배열입니다.

c = np.array([[4, 3], [2, 1]])

d = np.array([[1, 2], [3, 4]])

print(c*d)

# [[4 6]

# [6 4]]

행렬 곱의 결과를 얻으려면 np.dot를 사용합니다 (Python >= 3.5의 경우 위와 같이 @를 사용합니다).

print(np.dot(c,d))

# [[13 20]

# [ 5 8]]

** 연산자 또한 다르게 작동합니다.

print(a**2)

# [[22 15]

# [10 7]]

print(c**2)

# [[16 9]

# [ 4 1]]

a이 행렬이므로 a**2는 행렬 곱을 반환합니다. c가 ndarray이므로 c**2는 각 구성 요소를 제곱한 ndarray를 반환합니다.

행렬 객체와 ndarrays 간 기술적 구별 사항이 더 있습니다 (기능 선택과 순서 동작 등과 관련이 있습니다).

넘파이 배열의 주요 이점은 2차원 행렬보다 더 일반적이라는 것입니다. 3차원 배열이 필요한 경우 어떻게 됩니까? 그런 경우에는 행렬 객체가 아닌 ndarray를 사용해야 합니다. 따라서 행렬 객체 사용 방법을 배우는 것은 더 많은 작업이 필요합니다. 행렬 객체 연산과 ndarray 연산 모두를 배워야 하기 때문입니다.

배열과 행렬을 혼합하는 프로그램을 작성하면 변수 유형을 추적해야 하므로 수학적 곱셈이 예상하지 않은 결과를 반환할 가능성이 있어서 일이 어려워집니다.

대조적으로, 만약 당신이 ndarray에만 집중한다면, 당신은 약간 다른 기능/표기법을 사용하여 행렬 객체가 할 수 있는 모든 것과 더 많은 것을 할 수 있습니다.

만약 NumPy 행렬 곱셈 표기법의 시각적인 매력을 포기할 준비가 있다면 (Python >= 3.5에서 ndarray로 거의 같은 정도의 우아함으로 구현할 수 있습니다.), 나는 NumPy 배열이 확실히 선택해야 하는 방법이라고 생각합니다.

PS. 물론 한 가지를 선택하는 대가로 다른 것을 포기할 필요는 없습니다. 왜냐하면 np.asmatrix와 np.asarray가 2차원 배열이면 서로를 변환할 수 있기 때문입니다.

NumPy arrays와 NumPy matrix es here의 차이 요약이 있습니다.

답변 2

넘파이(Numpy)는 파이썬에서 배열을 다루는 데 유용한 라이브러리이다. 넘파이를 이용하면 파이썬의 기본 리스트와 같은 데이터 타입보다 훨씬 더 강력한 다차원 배열을 사용할 수 있으며, 이러한 배열은 행렬(Matrix)과 유사하다. 하지만 넘파이에서는 배열과 행렬이 서로 다른 개념으로 사용된다.

넘파이의 배열(array)은 다차원 배열로 행렬과 매우 유사하지만, 배열은 일반적으로 차원이 높고 더욱 자유롭게 사용할 수 있다는 장점이 있다. 배열은 벡터, 행렬, 다차원 배열 등 여러 형태로 구성되어 있으며, 이러한 배열은 빠른 계산이 필요한 경우에 매우 유용하다. 넘파이 배열은 데이터를 저장하고 연산하는 데 최적화되어 있으며, 일반적으로 파이썬의 리스트보다 빠른 처리 속도와 간편한 사용성을 제공한다.

반면에 넘파이의 행렬(Matrix)은 2차원 배열(2D array)을 강화한 것이다. 행렬은 보통 수학에서 많이 사용되며, 벡터 공간에서의 선형 변환을 나타내는 데 자주 사용된다. 행렬은 넘파이의 배열과 마찬가지로 수학 연산에 적합하며, 행렬 연산을 적용하는 경우 상당한 이점을 제공한다.

따라서, 넘파이 배열과 행렬은 서로 다른 개념으로 사용되며 각각의 장단점이 존재한다. 배열은 다양한 형태의 다차원 데이터를 사용할 수 있고 가변적인 크기로 자유롭게 다룰 수 있다. 반면에, 행렬은 수학식에서 사용되는 연산에 최적화되며 2차원 데이터를 다룰 때 매우 유용하다. 사용하고자 하는 데이터의 종류와 애플리케이션의 목적에 따라 배열과 행렬 중에서 적절한 것을 선택해야 한다.

결론적으로, 넘파이에서 배열과 행렬은 서로 다른 개념이며 각각의 특징과 용도가 있다. 다차원 숫자 데이터를 가장 효과적으로 계산하고 처리하기 위해서는 두 형태를 모두 잘 이해하고 활용하는 것이 핵심이다.

반응형