Co oznacza -1 w przekształceniu numpy?


419

Macierz numpy można przekształcić w wektor za pomocą funkcji zmiany kształtu z parametrem -1. Ale nie wiem, co -1 oznacza tutaj.

Na przykład:

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

Wynikiem bjest:matrix([[1, 2, 3, 4, 5, 6, 7, 8]])

Czy ktoś wie, co oznacza tutaj -1? I wydaje się, że python przypisuje -1 kilka znaczeń, takich jak: array[-1]oznacza ostatni element. Czy możesz podać wyjaśnienie?

Odpowiedzi:


566

Kryterium, które należy spełnić, aby nadać nowy kształt, jest to, że „nowy kształt powinien być zgodny z oryginalnym kształtem”

numpy pozwala nam podać jeden z nowych parametrów kształtu jako -1 (np .: (2, -1) lub (-1,3), ale nie (-1, -1)). Oznacza to po prostu, że jest to nieznany wymiar i chcemy, aby numpy go zrozumiał. I numpy to zrozumie, patrząc na „długość tablicy i pozostałe wymiary” i upewniając się, że spełnia wyżej wymienione kryteria

Teraz zobacz przykład.

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

Teraz próbuje przekształcić za pomocą (-1). Wynik nowego kształtu to (12) i jest zgodny z oryginalnym kształtem (3,4)

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

Teraz próbuję zmienić kształt za pomocą (-1, 1). Podaliśmy kolumnę jako 1, ale wiersze jako nieznane. Otrzymujemy więc nowy kształt jako (12, 1). Ponownie zgodny z oryginalnym kształtem (3,4)

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

Powyższe jest zgodne z komunikatem numpyporady / błędu, który można wykorzystać reshape(-1,1)w przypadku jednej funkcji; tj. pojedyncza kolumna

Przekształć dane, używając, array.reshape(-1, 1)jeśli dane mają jedną funkcję

Nowy kształt jako (-1, 2). wiersz nieznany, kolumna 2. otrzymujemy wynik nowy kształt jako (6, 2)

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

Teraz próbuję zachować kolumnę jako nieznaną. Nowy kształt jako (1, -1). tzn. wiersz to 1, kolumna nieznana. otrzymujemy nowy kształt jako (1, 12)

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

Powyższe jest zgodne z komunikatem numpyporady / błędu, który należy zastosować reshape(1,-1)dla pojedynczej próbki; tj. pojedynczy rząd

Przekształć dane, używając, array.reshape(1, -1)jeśli zawiera pojedynczą próbkę

Nowy kształt (2, -1). Wiersz 2, kolumna nieznana. otrzymujemy nowy kształt jako (2,6)

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

Nowy kształt jako (3, -1). Wiersz 3, kolumna nieznana. otrzymujemy nowy kształt jako (3,4)

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

I na koniec, jeśli spróbujemy podać oba wymiary jako nieznane, tj. Nowy kształt jako (-1, -1). Wyrzuci błąd

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

10
Ta odpowiedź zawiera wiele przykładów, ale nie wyjaśnia, co -1 robi zwykłym angielskim. Podczas przekształcania tablicy nowy kształt musi zawierać tę samą liczbę elementów co stary kształt, co oznacza, że ​​iloczyn wymiarów dwóch kształtów musi być równy. Przy zastosowaniu -1 wymiar odpowiadający -1 będzie iloczynem wymiarów oryginalnej tablicy podzielonej przez iloczyn wymiarów podanych reshapetak, aby zachować tę samą liczbę elementów.
BallpointBen

1
Moim zdaniem zarówno zaakceptowana odpowiedź, jak i ta odpowiedź są pomocne, podczas gdy zaakceptowana odpowiedź jest prostsza, wolę prostszą odpowiedź
cloudcomputes

1
W jaki sposób kształt (12, 1) jest „zgodny” z kształtem (3,4)?
Vijender

1
@Vijender Myślę, że oznacza to tę samą liczbę elementów, ale inną oś - tj. 12x1 == 3x4?
David Waterworth

80

Służy do przekształcania tablicy.

Powiedzmy, że mamy trójwymiarową tablicę o wymiarach 2 x 10 x 10:

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

Teraz chcemy zmienić format na 5 X 5 x 8:

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

wykona robotę.

Zauważ, że po naprawieniu pierwszego dim = 5 i drugiego dim = 5 nie trzeba określać trzeciego wymiaru. Aby pomóc w lenistwie, python daje opcję -1:

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

da ci tablicę kształtu = (5, 5, 8).

Również,

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

da ci tablicę kształtu = (50, 4)

Możesz przeczytać więcej na http://anie.me/numpy-reshape-transpose-theano-dimshuffle/


59

Według the documentation:

newshape: int lub krotka ints

Nowy kształt powinien być zgodny z oryginalnym kształtem. Jeśli jest liczbą całkowitą, wynikiem będzie tablica 1-D o tej długości. Jeden wymiar kształtu może wynosić -1. W tym przypadku wartość jest wywnioskowana na podstawie długości tablicy i pozostałych wymiarów.


W tym przypadku przyjmuje się, że wartość wynosi [1, 8]. A 8 to całkowita liczba macierzy a. dobrze?
user2262504

@ user2262504, nie jestem pewien. Myślę, że wartość wywnioskowana jest [8]dlatego, że dokumentacja tak mówi ( 1-D array). Spróbować numpy.reshape(a, [8]). Daje taki sam wynik jak numpy.reshape(a, [1,8])dla matrycy.
falsetru,

3
-1 pozwala numpy określić dla ciebie nieznaną liczbę kolumn lub wierszy w wynikowej macierzy. Uwaga: nieznane powinny być kolumny lub wiersze, a nie oba.
Gathide,

15

numpy.reshape (a, newshape, order {}) sprawdź poniższy link, aby uzyskać więcej informacji. https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html

w poniższym przykładzie, o którym wspomniałeś, dane wyjściowe wyjaśniają, że powstały wektor jest pojedynczym wierszem. (-1) wskazuje liczbę wierszy do 1., jeśli

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

wynik:

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

można to wyjaśnić dokładniej na innym przykładzie:

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

wyjście: (jest jednowymiarową tablicą kolumnową)

tablica ([[0],

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

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

wynik: (jest jednowymiarową tablicą wierszy)

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


12

Jest dość łatwy do zrozumienia. „-1” oznacza „nieznany wymiar”, który można wprowadzić z innego wymiaru. W takim przypadku, jeśli ustawisz swoją matrycę w ten sposób:

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

Zmodyfikuj swoją matrycę w następujący sposób:

b = numpy.reshape(a, -1)

Wywoła niektóre operacje niesłyszące do macierzy a, która zwróci tablicę numpy / martrix 1-d.

Jednak nie sądzę, że dobrym pomysłem jest używanie takiego kodu. Dlaczego nie spróbować:

b = a.reshape(1,-1)

Zapewni to ten sam wynik i czytelnicy zrozumieją: Ustaw b jako inny kształt a. Dla a, nie wiemy, ile kolumn powinien mieć (ustaw na -1!), Ale chcemy tablicy 1-wymiarowej (ustaw pierwszy parametr na 1!).


9

Krótka historia : ustawiłeś niektóre wymiary i pozwoliłeś NumPy ustawić pozostałe.

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

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

To była odpowiedź w języku angielskim, której szukałem, prosta i prosta. tzn. dajesz preferencje projektowe, niech numpy opracuje pozostałą matematykę :)
Sumanth Lazarus

6

Oznacza to po prostu, że nie jesteś pewien, jaką liczbę wierszy lub kolumn możesz podać, i prosisz numpy o zasugerowanie liczby kolumn lub wierszy, w których chcesz zmienić kształt.

numpy podaje ostatni przykład -1 https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html

sprawdź poniższy kod i jego dane wyjściowe, aby lepiej zrozumieć (-1):

KOD:-

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)

WYNIK :-

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

Ostatecznym wynikiem konwersji jest to, że liczba elementów w końcowej tablicy jest taka sama jak początkowej tablicy lub ramki danych.

-1 odpowiada nieznanej liczbie wierszy lub kolumn. możemy myśleć o tym jako x(nieznane). xjest uzyskiwany przez podzielenie liczby elementów w oryginalnej tablicy przez drugą wartość uporządkowanej pary z -1.

Przykłady

12 elementów o zmienionym kształcie (-1,1) odpowiada tablicy o x= 12/1 = 12 wierszy i 1 kolumnie.


12 elementów o zmienionym kształcie (1, -1) odpowiada tablicy z 1 rzędem i x= 12/1 = 12 kolumn.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.