Numpy yeniden şekillendirmede -1 ne anlama geliyor?


420

Numpy matrisi, parametre -1 ile yeniden şekillendirme işlevi kullanılarak bir vektöre yeniden şekillendirilebilir. Ama -1'in burada ne anlama geldiğini bilmiyorum.

Örneğin:

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

Sonuç b:matrix([[1, 2, 3, 4, 5, 6, 7, 8]])

Burada -1'in ne anlama geldiğini bilen var mı? Ve python -1'e çeşitli anlamlar atamış gibi görünüyor: array[-1]son element anlamına gelir. Bir açıklama yapabilir misiniz?

Yanıtlar:


567

Yeni şekli sağlamak için yerine getirilmesi gereken kriter 'Yeni şekil orijinal şekliyle uyumlu olmalıdır'

numpy yeni şekil parametrelerinden birini -1 olarak vermemize izin verir (örneğin: (2, -1) veya (-1,3) ama (-1, -1) değil). Bu sadece bilinmeyen bir boyut olduğu anlamına gelir ve numpy'nin bunu çözmesini istiyoruz. Ve numpy bunu 'dizinin uzunluğuna ve kalan boyutlara' bakarak ve yukarıda belirtilen kriterleri karşıladığından emin olarak anlayacaktır.

Şimdi örneğe bakın.

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

Şimdi (-1) ile yeniden şekillendirmeye çalışıyorum. Sonuç yeni şekil (12,) ve orijinal şekil (3,4) ile uyumlu

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

Şimdi (-1, 1) ile yeniden şekillendirmeye çalışıyorum. Sütunu 1, satırları bilinmiyor olarak sağladık. Böylece sonuç olarak yeni şekli elde ediyoruz (12, 1). Orijinal şekliyle uyumlu hale getirin (3,4)

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

Yukarıdakiler tek bir özellik numpyiçin kullanmak reshape(-1,1)üzere tavsiye / hata mesajı ile tutarlıdır ; yani tek sütun

Verileriniz tek bir özelliğearray.reshape(-1, 1) sahipse verilerinizi yeniden şekillendirme

(-1, 2) olarak yeni şekil. satır bilinmiyor, 2. sütun. (6, 2)

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

Şimdi sütunu bilinmeyen tutmaya çalışıyor. (1, -1) şeklinde yeni şekil. yani satır 1, sütun bilinmiyor. sonuç olarak yeni bir şekil alırız (1, 12)

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

Yukarıdakiler tek bir örnek numpyiçin kullanılacak tavsiye / hata mesajı ile tutarlıdır reshape(1,-1); yani tek sıra

Tek bir örnekarray.reshape(1, -1) içeriyorsa verilerinizi yeniden şekillendirin

Yeni şekil (2, -1). Satır 2, sütun bilinmiyor. sonuç olarak yeni bir şekil alırız (2,6)

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

(3, -1) şeklinde yeni şekil. Satır 3, sütun bilinmiyor. sonuç olarak yeni bir şekil alırız (3,4)

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

Ve son olarak, eğer her iki boyutu da bilinmeyen olarak sağlamaya çalışırsak, yani yeni şekil (-1, -1) olarak. Bir hata atacak

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

11
Bu cevap çok fazla örnek içeriyor, ancak -1'in düz İngilizce'de ne yaptığını ortaya koymuyor. Bir diziyi yeniden şekillendirirken, yeni şekil eski şekil ile aynı sayıda öğe içermelidir, yani iki şeklin boyutlarındaki ürünler eşit olmalıdır. -1 kullanıldığında, -1'e karşılık gelen boyut, orijinal dizinin boyutlarının çarpımı reshape, aynı sayıda elemanı korumak için verilen boyutların çarpımına bölünür .
BallpointBen

1
Kanımca kabul edilen cevap ve bu cevap hem yararlı, hem de kabul edilen cevap daha basit, daha basit cevabı tercih ediyorum
bulutlar

1
Şekil (12, 1) şekil (3,4) ile nasıl "uyumlu"?
Vijender

1
@Vijender Sanırım aynı sayıda eleman ama farklı eksen anlamına geliyor - yani 12x1 == 3x4?
David Waterworth

80

Bir diziyi yeniden şekillendirmek için kullanılır.

Diyelim ki 2 x 10 x 10 boyutlarında 3 boyutlu bir dizimiz var:

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

Şimdi 5 X 5 x 8 şeklinde yeniden şekillendirmek istiyoruz:

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

işi yapacak.

İlk dim = 5 ve ikinci dim = 5 sabitlendikten sonra üçüncü boyutu belirlemenize gerek olmadığını unutmayın. Tembelliğinize yardımcı olmak için python -1 seçeneği sunar:

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

size bir dizi şekil verecektir = (5, 5, 8).

Aynı şekilde,

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

size bir şekil dizisi verecektir = (50, 4)

Daha fazla bilgiyi http://anie.me/numpy-reshape-transpose-theano-dimshuffle/ adresinde bulabilirsiniz.


59

Göre the documentation:

newshape: int veya bir demet ints

Yeni şekil, orijinal şekil ile uyumlu olmalıdır. Bir tamsayı ise, sonuç bu uzunlukta bir 1-D dizisi olacaktır. Bir şekil boyutu -1 olabilir . Bu durumda, değer dizinin uzunluğundan ve kalan boyutlardan çıkarılır.


Bu durumda, değerin [1, 8] olduğu tahmin edilmektedir. Ve 8, a matrisinin toplam sayısıdır. sağ?
user2262504

@ user2262504, emin değilim. Çıkarılan değerin [8]belgelerin böyle söylediği için olduğunu düşünüyorum ( 1-D array). Deneyin numpy.reshape(a, [8]). numpy.reshape(a, [1,8])Matris için aynı sonucu verir .
falsetru

3
-1, numpy'nin sonuçta elde edilen matristeki bilinmeyen sütun veya satır sayısını belirlemesini sağlar. Not: bilinmeyen sütun veya satır olmalıdır, ikisi birden olmamalıdır.
Gathide

15

numpy.reshape (a, newshape, order {}) daha fazla bilgi için aşağıdaki bağlantıyı kontrol edin. https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html

bahsettiğiniz aşağıdaki örnek için çıktı, elde edilen vektörün tek bir satır olduğunu açıklar. (- 1) satır sayısını 1 olarak gösterir.

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

çıktı:

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

bu başka bir örnekle daha ayrıntılı olarak açıklanabilir:

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

output: (1 boyutlu sütun dizisidir)

Dizi ([[0],

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

b = np. aralık (10). şekil ((1, -1))

output: (1 boyutlu satır dizisidir)

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


12

Anlamak oldukça kolaydır. "-1", başka bir boyuttan çıkarılması gereken "bilinmeyen boyut" anlamına gelir. Bu durumda, matrisinizi şu şekilde ayarlarsanız:

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

Matrisinizi şu şekilde değiştirin:

b = numpy.reshape(a, -1)

A matrisine 1-d numpy dizi / martrix döndürecek bazı sağlam işlemler çağıracaktır.

Ancak, böyle bir kod kullanmak iyi bir fikir olduğunu sanmıyorum. Neden denemiyorsunuz:

b = a.reshape(1,-1)

Size aynı sonucu verecektir ve okuyucuların anlaması daha açıktır: b'yi a'nın başka bir şekli olarak ayarlayın. A için, ne kadar sütuna sahip olmamız gerektiğini (-1 olarak ayarlayın!), Ancak 1 boyutlu bir dizi istiyoruz (ilk parametreyi 1 olarak ayarlayın!).


9

Uzun lafın kısası : bazı boyutları belirlersiniz ve NumPy'nin kalan (lar) ı ayarlamasına izin verirsiniz.

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

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

Bu aradığım İngilizce'nin cevabı, sade ve basit. yani tasarım tercihinizi verin, numpy kalan matematik üzerinde çalışalım :)
Sumanth Lazarus

6

Basitçe, kaç satır veya sütun verebileceğinizden emin olmadığınız anlamına gelir ve numpy'den yeniden biçimlendirilecek sütun veya satır sayısını önermesini istersiniz.

numpy -1 için son örneği sağlar https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html

(-1) hakkında daha iyi anlamak için aşağıdaki kodu ve çıktısını kontrol edin:

KODU: -

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)

ÇIKTI :-

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

Dönüşümün nihai sonucu, son dizideki öğelerin sayısının ilk dizi veya veri çerçevesiyle aynı olmasıdır.

-1, satır veya sütunun bilinmeyen sayısına karşılık gelir. bunu x(bilinmiyor) olarak düşünebiliriz . xorijinal dizideki elemanların umberini sıralı çiftin diğer değeri -1 ile bölerek elde edilir.

Örnekler

Yeniden şekillendirilmiş (-1,1) 12 öğe, x= 12/1 = 12 satır ve 1 sütuna sahip bir diziye karşılık gelir .


Yeniden şekillendirilmiş 12 öğe (1, -1) 1 satır ve x= 12/1 = 12 sütun içeren bir diziye karşılık gelir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.