배열에 대한 Numpy 행렬


149

numpy를 사용하고 있습니다. 1 개의 열과 N 개의 행이있는 행렬이 있고 N 개의 요소로 배열을 가져 오려고합니다.

예를 들어, 내가 있으면 M = matrix([[1], [2], [3], [4]])을 얻고 싶습니다 A = array([1,2,3,4]).

그것을 달성하기 위해을 사용 A = np.array(M.T)[0]합니다. 누구든지 동일한 결과를 얻는 더 우아한 방법을 알고 있습니까?

감사!


답변:


192

좀 더 읽기 쉬운 것을 원한다면 다음과 같이하십시오.

A = np.squeeze(np.asarray(M))

동등하게, 당신은 또한 할 수 있습니다 : A = np.asarray(M).reshape(-1), 그러나 조금 덜 읽기 쉽습니다.


9
내 부분에 작은 소리가 ... numpy가 배열과 행렬을 별도의 엔티티로 갖는 이유는 무엇입니까? 그것은 너무 비현실적인 IMHO입니다. 이 팁 @Joe에 감사드립니다.
Naijaba

6
@Naijaba-가치있는 것으로서, 매트릭스 클래스는 효과적으로 (그러나 공식적으로는) 감가 상각되지 않습니다. 역사적으로 주로 사용됩니다. 제거 numpy.matrix는 다소 논쟁의 여지가 있지만, numpy 개발자는 모두 여러 가지 이유로 비현실적이고 성가신다는 것에 동의합니다. 그러나 사용 matrix하지 않는 오래된 "유효하지 않은"코드를 사용 하면 코드 를 완전히 제거하기가 어렵습니다.
Joe Kington

1
말할 것도없이, 실제 행렬 곱셈은 Numpy 1.10의 배열에 대해서만 추가되었으며 기본적으로 여전히 베타입니다. 이것은 우리 자신을 포함하여 많은 사람들이 우리가 원하는 것을 끝내기 위해 배열 대신 행렬을 사용해야한다는 것을 의미합니다. docs.scipy.org/doc/numpy/reference/generated/numpy.matmul.html
Georges Oates Larsen

1
희소 행렬은 메모리 효율적인 기계 학습 (예 :)에 기본입니다 sklearn. 실제로의 다른 sparse matrix유형 이 있으므로 scipy행 또는 열을 통해 효율적으로 액세스 할 수 있습니다. 이것이 매트릭스와 배열의 개념을 병합하는 데 문제가 될 수 있다고 생각합니다. 즉, sparse array유형을 도입 할 수 있는지 여부 와 그 계획이 있는지 궁금합니다 . 단서가 있습니까?
pms

결국 1D 배열을 원한다면 .flatten ()이 .squeeze ()와 같이 작동한다고 생각합니다.
wordsforthewise

122

6
나는이 답변이 수용된 답변, 성능, 단순성보다 낫다고 생각합니다
dariush

M.A1은 "ravel"및 "flatten"과 동일하게 구현되며,이 경우 데이터 사본 A가 발생하지 않으므로 M에 연결된 상태로 유지되므로 A 및 / 또는 M이 변경 가능한 경우 놀라움을 유발할 수 있습니다. "flatiter"생성기 (읽기 전용 의미론)를 반환하는 M.flat 정품 대안 np.squeeze (M) # 크기 1의 치수를 제거하는 뷰를 제공합니다. M, -1) #은 일반적으로 모양 호환성에 따라보기이며,이 "-1"은 A1 / ravel / flatten을 수행하는 원형 교차로입니다.
jayprich

13
A, = np.array(M.T)

내가 생각하는 우아함에 의해 당신이 무엇을 의미하는지에 따라 다릅니다.


11

다음 변형을 시도 할 수 있습니다.

result=np.array(M).flatten()

7
np.array(M).ravel()

속도를 걱정한다면; 그러나 기억이 걱정된다면 :

np.asarray(M).ravel()

이유를 설명하면 답변의 질이 향상 될 것입니다
Milo Wielondek

6

또는 당신은 몇 가지 온도를 피하려고 노력할 수 있습니다.

A = M.view(np.ndarray)
A.shape = -1

2

먼저 Mv = numpy.asarray(M.T)4x1이지만 2D 배열을 제공합니다.

그런 다음 수행 A = Mv[0,:]하면 원하는 것을 얻을 수 있습니다. 당신은 그것들을 같이 넣을 수 있습니다 numpy.asarray(M.T)[0,:].



0

numpy의 ravel ()flatten () 함수는 여기서 시도 할 두 가지 기술입니다. Joe , Siraj , bubble , Kevad가 작성한 게시물에 추가 하고 싶습니다 .

얽힘:

A = M.ravel()
print A, A.shape
>>> [1 2 3 4] (4,)

반음 낮추다:

M = np.array([[1], [2], [3], [4]])
A = M.flatten()
print A, A.shape
>>> [1 2 3 4] (4,)

numpy.ravel()배열의 복사본을 만들지 않는 라이브러리 수준 함수이므로 더 빠릅니다 . 그러나을 사용하는 경우 배열 A의 변경 사항은 원래 배열 M로 넘어갑니다numpy.ravel() .

numpy.flatten()보다 느립니다numpy.ravel() . 그러나 numpy.flatten()A를 만드는 데 사용 하는 경우 A의 변경 사항은 원래 배열 M으로 전달되지 않습니다 .

numpy.squeeze()그리고 M.reshape(-1)보다 느린 numpy.flatten()하고 numpy.ravel().

%timeit M.ravel()
>>> 1000000 loops, best of 3: 309 ns per loop

%timeit M.flatten()
>>> 1000000 loops, best of 3: 650 ns per loop

%timeit M.reshape(-1)
>>> 1000000 loops, best of 3: 755 ns per loop

%timeit np.squeeze(M)
>>> 1000000 loops, best of 3: 886 ns per loop
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.