numpy reshape에서 -1은 무엇을 의미합니까?


420

numpy 행렬은 매개 변수 -1을 가진 재구성 기능을 사용하여 벡터로 재구성 될 수 있습니다. 그러나 나는 -1이 무엇을 의미하는지 모르겠습니다.

예를 들면 다음과 같습니다.

a = numpy.matrix([[1, 2, 3, 4], [5, 6, 7, 8]])
b = numpy.reshape(a, -1)

결과 b는 다음과 같습니다.matrix([[1, 2, 3, 4, 5, 6, 7, 8]])

-1이 무엇을 의미하는지 아는 사람이 있습니까? 그리고 파이썬은 -1과 같은 몇 가지 의미를 할당하는 것 같습니다 : array[-1]마지막 요소를 의미합니다. 설명해 줄 수 있습니까?

답변:


567

새로운 모양을 제공하기 위해 충족해야 할 기준은 '새로운 모양은 원래 모양과 호환되어야합니다'입니다.

numpy를 사용하면 새로운 모양 매개 변수 중 하나를 -1 (예 : (2, -1) 또는 (-1,3)이지만 (-1, -1)은 아님)로 지정할 수 있습니다. 그것은 단순히 그것이 알려지지 않은 차원이라는 것을 의미하며 우리는 numpy가 그것을 알아 내기를 원합니다. 그리고 numpy는 '배열의 길이와 남은 치수'를 보고 위에서 언급 한 기준을 충족시키는 지 확인하여 이것을 파악합니다.

이제 예제를 참조하십시오.

z = np.array([[1, 2, 3, 4],
         [5, 6, 7, 8],
         [9, 10, 11, 12]])
z.shape
(3, 4)

이제 (-1)로 재구성하려고합니다. 결과 새 모양은 (12)이고 원래 모양과 호환됩니다 (3,4)

z.reshape(-1)
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])

이제 (-1, 1)로 재구성하려고합니다. 우리는 열을 1로 제공했지만 행을 unknown으로 제공했습니다. 따라서 우리는 (12, 1)과 같은 새로운 모양을 얻습니다. 원래 모양과 다시 호환됩니다 (3,4)

z.reshape(-1,1)
array([[ 1],
   [ 2],
   [ 3],
   [ 4],
   [ 5],
   [ 6],
   [ 7],
   [ 8],
   [ 9],
   [10],
   [11],
   [12]])

위의 내용은 단일 기능 numpy에 사용 reshape(-1,1)하기위한 조언 / 오류 메시지 와 일치 합니다. 즉 단일 컬럼

array.reshape(-1, 1)데이터에 단일 기능 이있는 경우 데이터를 재구성하십시오

(-1, 2)와 같은 새로운 모양. 행을 알 수 없음, 열 2입니다. 결과는 (6, 2)

z.reshape(-1, 2)
array([[ 1,  2],
   [ 3,  4],
   [ 5,  6],
   [ 7,  8],
   [ 9, 10],
   [11, 12]])

이제 열을 알 수없는 것으로 유지하려고합니다. (1, -1)과 같은 새로운 모양. 즉, 행은 1이며 열을 알 수 없습니다. 우리는 (1, 12)

z.reshape(1,-1)
array([[ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12]])

위의 내용은 단일 샘플 numpy에 사용 reshape(1,-1)하기위한 조언 / 오류 메시지 와 일치합니다 . 즉 단일 행

단일 샘플array.reshape(1, -1) 이 포함 된 데이터를 사용하여 데이터 재구성

새로운 모양 (2, -1). 행 2, 열을 알 수 없습니다. 우리는 (2,6)

z.reshape(2, -1)
array([[ 1,  2,  3,  4,  5,  6],
   [ 7,  8,  9, 10, 11, 12]])

(3, -1)과 같은 새로운 모양. 행 3, 열을 알 수 없습니다. 우리는 (3,4)

z.reshape(3, -1)
array([[ 1,  2,  3,  4],
   [ 5,  6,  7,  8],
   [ 9, 10, 11, 12]])

마지막으로, 두 차원을 알 수없는 차원, 즉 (-1, -1)과 같은 새로운 모양으로 제공하려고하면. 오류가 발생합니다

z.reshape(-1, -1)
ValueError: can only specify one unknown dimension

11
이 답변에는 많은 예제가 포함되어 있지만 -1이 평범한 영어로하는 일을 설명하지는 않습니다. 배열의 모양을 변경할 때 새 모양에는 이전 모양과 같은 수의 요소가 포함되어야합니다. 즉, 두 모양의 차원 곱이 같아야합니다. -1을 사용할 때 -1에 해당하는 차원은 reshape동일한 수의 요소를 유지하기 위해 원래 배열의 차원의 곱을 주어진 차원의 곱으로 나눈 값 입니다.
BallpointBen

1
내 의견으로는 허용 대답이 대답은 허용 대답은 더 간단 반면, 나는 간단한 대답 좋아, 모두 도움이됩니다
cloudscomputes

1
셰이프 (12, 1)는 셰이프 (3,4)와 어떻게 호환됩니까?
Vijender

1
@Vijender 나는 그것이 같은 수의 요소를 의미하지만 축이 다른 것을 의미한다고 생각합니다-즉 12x1 == 3x4?
David Waterworth

80

배열을 재구성하는 데 사용됩니다.

크기가 2 x 10 x 10 인 3 차원 배열이 있다고 가정합니다.

r = numpy.random.rand(2, 10, 10) 

이제 5 X 5 x 8로 재구성하고 싶습니다.

numpy.reshape(r, shape=(5, 5, 8)) 

일을 할 것입니다.

첫 번째 dim = 5 및 두 번째 dim = 5를 수정하면 3 차원을 결정할 필요가 없습니다. 게으름을 돕기 위해 python은 -1 옵션을 제공합니다.

numpy.reshape(r, shape=(5, 5, -1)) 

모양 = (5, 5, 8)의 배열을 제공합니다.

마찬가지로,

numpy.reshape(r, shape=(50, -1)) 

당신에게 모양의 배열을 줄 것입니다 = (50, 4)

http://anie.me/numpy-reshape-transpose-theano-dimshuffle/ 에서 자세한 내용을 읽을 수 있습니다.


59

에 따르면 the documentation:

newshape : 정수 또는 튜플 정수

새로운 모양은 원래 모양과 호환되어야합니다. 정수이면 결과는 해당 길이의 1 차원 배열이됩니다. 하나의 모양 차원은 -1 일 수 있습니다 . 이 경우 값은 배열의 길이와 나머지 치수에서 추론됩니다.


이 경우 값은 [1, 8]로 추론됩니다. 그리고 8은 행렬 a의 총 수입니다. 권리?
user2262504

@ user2262504, 확실하지 않습니다. 유추 된 가치 [8]는 문서가 그렇게 말했기 때문 이라고 생각합니다 ( 1-D array). 시도하십시오 numpy.reshape(a, [8]). numpy.reshape(a, [1,8])행렬 과 동일한 결과를 얻습니다.
falsetru

3
-1은 numpy가 결과 행렬에서 알 수없는 열 또는 행 수를 결정하도록합니다. 참고 : 알 수없는 열 또는 행이어야합니다.
Gathide

15

numpy.reshape (a, newshape, order {}) 자세한 내용은 아래 링크를 확인하십시오. https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html

아래 예제에서 출력은 결과 벡터가 단일 행이라고 설명합니다. (-1)은 1이되는 행 수를 나타냅니다.

a = numpy.matrix([[1, 2, 3, 4], [5, 6, 7, 8]])
b = numpy.reshape(a, -1)

산출:

행렬 ([[1, 2, 3, 4, 5, 6, 7, 8]])

다른 예를 통해보다 정확하게 설명 할 수 있습니다.

b = np.arange(10).reshape((-1,1))

출력 : (1 차원 주상 배열입니다)

배열 ([[0],

   [1],
   [2],
   [3],
   [4],
   [5],
   [6],
   [7],
   [8],
   [9]])

b = np.arange (10). 재 형성 ((1, -1))

출력 : (1 차원 행 배열입니다)

배열 ([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])


12

이해하기 매우 쉽습니다. "-1"은 다른 차원에서 유추 할 수있는 "알 수없는 차원"을 나타냅니다. 이 경우 행렬을 다음과 같이 설정하면

a = numpy.matrix([[1, 2, 3, 4], [5, 6, 7, 8]])

다음과 같이 행렬을 수정하십시오.

b = numpy.reshape(a, -1)

행렬 a에 대한 deafult 연산을 호출하여 1-d numpy array / martrix를 반환합니다.

그러나 이와 같은 코드를 사용하는 것은 좋은 생각이 아닙니다. 시도해 보지 않겠습니까?

b = a.reshape(1,-1)

동일한 결과를 얻을 수 있으며 독자가 이해하기가 더 명확합니다. b를 다른 모양으로 설정하십시오. a의 경우 열의 수는 없지만 (-1로 설정) 1 차원 배열 (첫 번째 매개 변수를 1로 설정)을 원합니다.


9

간단히 말해 : 일부 치수를 설정하고 NumPy가 나머지를 설정하게합니다.

(userDim1, userDim2, ..., -1) -->>

(userDim1, userDim1, ..., TOTAL_DIMENSION - (userDim1 + userDim2 + ...))

이것은 내가 찾던 영어의 평범하고 단순한 대답입니다. 즉, 당신은 :) 나머지 수학에서 NumPy와 일을, 당신의 디자인 환경을 제공 할 수
수만 스 나사로에게

6

그것은 당신이 줄 수있는 행이나 열 수에 대해 확신하지 못하고 numpy에게 재구성 할 열 또는 행 수를 제안하도록 요청한다는 것을 의미합니다.

numpy는 -1 https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html에 대한 마지막 예를 제공합니다.

(-1)에 대해 더 잘 이해하려면 아래 코드와 출력을 확인하십시오.

암호:-

import numpy
a = numpy.matrix([[1, 2, 3, 4], [5, 6, 7, 8]])
print("Without reshaping  -> ")
print(a)
b = numpy.reshape(a, -1)
print("HERE We don't know about what number we should give to row/col")
print("Reshaping as (a,-1)")
print(b)
c = numpy.reshape(a, (-1,2))
print("HERE We just know about number of columns")
print("Reshaping as (a,(-1,2))")
print(c)
d = numpy.reshape(a, (2,-1))
print("HERE We just know about number of rows")
print("Reshaping as (a,(2,-1))")
print(d)

출력 :-

Without reshaping  -> 
[[1 2 3 4]
 [5 6 7 8]]
HERE We don't know about what number we should give to row/col
Reshaping as (a,-1)
[[1 2 3 4 5 6 7 8]]
HERE We just know about number of columns
Reshaping as (a,(-1,2))
[[1 2]
 [3 4]
 [5 6]
 [7 8]]
HERE We just know about number of rows
Reshaping as (a,(2,-1))
[[1 2 3 4]
 [5 6 7 8]]

2
import numpy as np
x = np.array([[2,3,4], [5,6,7]]) 

# Convert any shape to 1D shape
x = np.reshape(x, (-1)) # Making it 1 row -> (6,)

# When you don't care about rows and just want to fix number of columns
x = np.reshape(x, (-1, 1)) # Making it 1 column -> (6, 1)
x = np.reshape(x, (-1, 2)) # Making it 2 column -> (3, 2)
x = np.reshape(x, (-1, 3)) # Making it 3 column -> (2, 3)

# When you don't care about columns and just want to fix number of rows
x = np.reshape(x, (1, -1)) # Making it 1 row -> (1, 6)
x = np.reshape(x, (2, -1)) # Making it 2 row -> (2, 3)
x = np.reshape(x, (3, -1)) # Making it 3 row -> (3, 2)

0

변환의 최종 결과는 최종 배열의 요소 수가 초기 배열 또는 데이터 프레임의 수와 동일하다는 것입니다.

-1은 행 또는 열의 알 수없는 수에 해당합니다. 우리는 그것을 x(알 수없는) 것으로 생각할 수 있습니다 . x는 원래 배열의 요소 수를 순서 쌍의 다른 값으로 -1로 나눠서 얻습니다.

reshape (-1,1)이있는 12 개의 요소는 x= 12 / 1 = 12 개의 행과 1 개의 열 이있는 배열에 해당합니다 .


reshape (1, -1)이있는 12 개의 요소는 1 개의 행과 x= 12 / 1 = 12 개의 열 이있는 배열에 해당합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.