[python] numpy 배열과 행렬의 차이점은 무엇입니까? 어느 것을 사용해야합니까?
각각의 장단점은 무엇입니까?
내가 본 것 중 하나가 필요할 경우 둘 중 하나를 다른 것으로 대체 할 수 있으므로 둘 다 사용하지 않아도됩니까?
프로그램의 스타일이 나의 선택에 영향을 줍니까? 나는 numpy를 사용하여 기계 학습을하고 있으므로 실제로 많은 행렬이 있지만 많은 벡터 (배열)가 있습니다.
답변
공식 문서에 따르면 매트릭스 클래스는 더 이상 제거되지 않으므로 더 이상 사용하지 않는 것이 좋습니다.
https://numpy.org/doc/stable/reference/generated/numpy.matrix.html
다른 답변에서 이미 NumPy 배열을 사용하여 모든 작업을 수행 할 수 있다고 나와 있습니다.
답변
Numpy 행렬 은 엄격하게 2 차원이며 Numpy 배열 (ndarray)은 N 차원입니다. 행렬 객체는 ndarray의 하위 클래스이므로 ndarray의 모든 속성과 메소드를 상속합니다.
numpy 행렬의 주요 장점은 행렬 곱셈에 편리한 표기법을 제공한다는 것입니다. 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는 @
연산자를 사용하여 infix 행렬 곱셈을 지원 하므로 Python> = 3.5에서 ndarray를 사용하여 행렬 곱셈과 동일한 편의를 얻을 수 있습니다.
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]]
행렬 객체와 ndarray는 모두 .T
전치 (transpose)를 반환해야하지만 행렬 객체는 .H
켤레 전치 (conjugate transpose)와 .I
역수 (inverse)에도 있습니다.
반대로 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
행렬 product를 반환합니다 a*a
. c
ndarray 이므로 c**2
각 구성 요소를 요소 단위로 제곱 한 ndarray를 반환합니다.
행렬 객체와 ndarrays ( np.ravel
항목 선택 및 시퀀스 동작과 관련 이 있음)에는 다른 기술적 차이가 있습니다.
numpy 배열의 주요 장점은 2 차원 행렬보다 더 일반적이라는 것 입니다. 3 차원 배열을 원하면 어떻게됩니까? 그런 다음 행렬 객체가 아닌 ndarray를 사용해야합니다. 따라서 매트릭스 객체 사용을 배우는 것이 더 많은 작업입니다. 매트릭스 객체 작업과 ndarray 연산을 배워야합니다.
행렬과 배열을 혼합하는 프로그램을 작성하면 변수가 어떤 유형의 객체인지 추적해야하기 때문에 곱셈이 예상치 못한 것을 반환하지 않기 때문에 삶을 어렵게 만듭니다.
반대로, ndarray 만 사용하면 약간 다른 기능 / 표기법을 제외하고 매트릭스 객체가 수행 할 수있는 모든 작업을 수행 할 수 있습니다.
NumPy 매트릭스 제품 표기법 (Python> = 3.5의 ndarray로 거의 우아하게 달성 할 수 있음)의 시각적 매력을 기꺼이 포기하고 싶다면 NumPy 배열이 확실히 갈 길이라고 생각합니다.
추신. 물론, 당신은 정말 있기 때문에, 다른의 비용으로 하나를 선택할 필요가 없습니다 np.asmatrix
및 np.asarray
(배열은 2 차원입니다만큼) 당신이 다른 하나를 변환 할 수 있습니다.
NumPy와의 차이점의 개요가 arrays
NumPy와의 대 matrix
ES 여기가 .
답변
Scipy.org는 다음과 같은 배열 사용을 권장합니다.
* ‘배열’또는 ‘행렬’? 어느 것을 사용해야합니까? – 짧은 답변
배열을 사용하십시오.
그것들은 numpy의 표준 벡터 / 행렬 / 텐서 타입입니다. 많은 numpy 함수는 행렬이 아닌 배열을 반환합니다.
요소 별 연산과 선형 대수 연산에는 분명한 차이가 있습니다.
원하는 경우 표준 벡터 또는 행 / 열 벡터를 가질 수 있습니다.
배열 유형을 사용하는 유일한 단점은 두 개의 텐서를 곱하는 (스칼라 곱, 행렬 벡터 곱하기 등)
dot
대신 사용해야한다는 것입니다*
.
답변
unutbu의 목록에 하나의 사례를 추가하기 만하면됩니다.
numpy 행렬 또는 matlab과 같은 행렬 언어와 비교할 때 numpy ndarrays의 가장 큰 실제 차이점 중 하나는 치수가 축소 작업에서 유지되지 않는다는 것입니다. 행렬의 크기는 항상 2d이지만 배열의 평균은 1 차원보다 작습니다.
예를 들어 행렬 또는 배열의 demean 행 :
매트릭스
>>> m = np.mat([[1,2],[2,3]])
>>> m
matrix([[1, 2],
[2, 3]])
>>> mm = m.mean(1)
>>> mm
matrix([[ 1.5],
[ 2.5]])
>>> mm.shape
(2, 1)
>>> m - mm
matrix([[-0.5, 0.5],
[-0.5, 0.5]])
배열로
>>> a = np.array([[1,2],[2,3]])
>>> a
array([[1, 2],
[2, 3]])
>>> am = a.mean(1)
>>> am.shape
(2,)
>>> am
array([ 1.5, 2.5])
>>> a - am #wrong
array([[-0.5, -0.5],
[ 0.5, 0.5]])
>>> a - am[:, np.newaxis] #right
array([[-0.5, 0.5],
[-0.5, 0.5]])
또한 배열과 행렬을 혼합하면 많은 “행복한”디버깅 시간이 발생한다고 생각합니다. 그러나 scipy.sparse 행렬은 곱셈과 같은 연산자의 관점에서 항상 행렬입니다.
답변
다른 사람들이 언급했듯이, 아마도 가장 큰 장점은 matrix
행렬 곱셈에 편리한 표기법을 제공한다는 것입니다.
그러나 Python 3.5에는 마침내 행렬 곱셈을위한 전용 infix 연산자가 있습니다 .@
.
최신 NumPy 버전에서는 ndarray
s 와 함께 사용할 수 있습니다 .
A = numpy.ones((1, 3))
B = numpy.ones((3, 3))
A @ B
따라서 오늘날에는 의심 할 여지없이 더 많은 것을 고수해야합니다 ndarray
.