Apa yang -1 maksud dalam membentuk kembali numpy?

420

Matriks numpy dapat dibentuk kembali menjadi vektor menggunakan fungsi membentuk kembali dengan parameter -1. Tapi saya tidak tahu apa yang saya maksud di sini.

Sebagai contoh:

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

Hasilnya badalah:matrix([[1, 2, 3, 4, 5, 6, 7, 8]])

Adakah yang tahu apa artinya -1 di sini? Dan tampaknya python menetapkan -1 beberapa makna, seperti: array[-1]berarti elemen terakhir. Bisakah Anda memberi penjelasan?

pengguna2262504
sumber

Jawaban:

568

Kriteria yang harus dipenuhi untuk menyediakan bentuk baru adalah bahwa 'Bentuk baru harus kompatibel dengan bentuk asli'

numpy memungkinkan kita untuk memberikan salah satu parameter bentuk baru sebagai -1 (misalnya: (2, -1) atau (-1,3) tetapi tidak (-1, -1)). Ini hanya berarti bahwa itu adalah dimensi yang tidak diketahui dan kami ingin numpy mengetahuinya. Dan numpy akan mencari ini dengan melihat 'panjang array dan dimensi yang tersisa' dan memastikan itu memenuhi kriteria yang disebutkan di atas

Sekarang lihat contohnya.

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

Sekarang mencoba untuk membentuk kembali dengan (-1). Bentuk baru yang dihasilkan adalah (12,) dan kompatibel dengan bentuk asli (3,4)

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

Sekarang mencoba untuk membentuk kembali dengan (-1, 1). Kami telah menyediakan kolom sebagai 1 tetapi baris sebagai tidak diketahui. Jadi kita mendapatkan hasil bentuk baru sebagai (12, 1). Lagi pula kompatibel dengan bentuk asli (3,4)

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

Di atas konsisten dengan numpysaran / pesan kesalahan, untuk digunakan reshape(-1,1)untuk fitur tunggal; yaitu kolom tunggal

Bentuk kembali data Anda menggunakan array.reshape(-1, 1)jika data Anda memiliki fitur tunggal

Bentuk baru sebagai (-1, 2). baris tidak diketahui, kolom 2. kita mendapatkan hasil bentuk baru seperti (6, 2)

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

Sekarang mencoba untuk menjaga kolom sebagai tidak dikenal. Bentuk baru sebagai (1, -1). yaitu baris 1, kolom tidak dikenal. kami mendapatkan hasil bentuk baru sebagai (1, 12)

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

Di atas konsisten dengan numpysaran / pesan kesalahan, untuk digunakan reshape(1,-1)untuk sampel tunggal; yaitu satu baris

Bentuk kembali data Anda menggunakan array.reshape(1, -1)jika itu berisi sampel tunggal

Bentuk baru (2, -1). Baris 2, kolom tidak dikenal. kami mendapatkan hasil bentuk baru sebagai (2,6)

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

Bentuk baru sebagai (3, -1). Baris 3, kolom tidak dikenal. kami mendapatkan hasil bentuk baru sebagai (3,4)

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

Dan akhirnya, jika kita mencoba memberikan kedua dimensi sebagai tidak dikenal yaitu bentuk baru sebagai (-1, -1). Itu akan melempar kesalahan

z.reshape(-1, -1)
ValueError: can only specify one unknown dimension
Julu Ahamed
sumber
11
Jawaban ini berisi banyak contoh tetapi tidak menjelaskan apa yang dilakukan -1 dalam bahasa Inggris biasa. Saat membentuk ulang array, bentuk baru harus berisi jumlah elemen yang sama dengan bentuk lama, artinya produk dari dimensi kedua bentuk harus sama. Saat menggunakan -1, dimensi yang sesuai dengan -1 akan menjadi produk dari dimensi array asli dibagi dengan produk dari dimensi yang diberikan reshapeuntuk mempertahankan jumlah elemen yang sama.
BallpointBen
1
Menurut pendapat saya jawaban yang diterima dan jawaban ini sama-sama membantu, sedangkan jawaban yang diterima lebih sederhana, saya lebih suka jawaban yang lebih sederhana
cloudscomputes
1
Bagaimana bentuk (12, 1) "kompatibel" dengan bentuk (3,4)?
Vijender
1
@ Vender Saya kira itu berarti jumlah elemen yang sama tetapi sumbu yang berbeda - yaitu 12x1 == 3x4?
David Waterworth
80

Digunakan untuk membentuk kembali sebuah array.

Katakanlah kita memiliki array dimensi 3 dimensi 2 x 10 x 10:

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

Sekarang kami ingin membentuk kembali menjadi 5 X 5 x 8:

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

akan melakukan pekerjaan itu.

Perhatikan bahwa, setelah Anda memperbaiki redup pertama = 5 dan redup kedua = 5, Anda tidak perlu menentukan dimensi ketiga. Untuk membantu kemalasan Anda, python memberikan opsi -1:

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

akan memberi Anda array bentuk = (5, 5, 8).

Juga,

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

akan memberi Anda array bentuk = (50, 4)

Anda dapat membaca lebih lanjut di http://anie.me/numpy-reshape-transpose-theano-dimshuffle/

Anuj Gupta
sumber
59

Menurut the documentation:

newshape: int atau tuple ints

Bentuk baru harus kompatibel dengan bentuk aslinya. Jika bilangan bulat, maka hasilnya akan menjadi array 1-D dengan panjang itu. Satu dimensi bentuk bisa -1. Dalam hal ini, nilai disimpulkan dari panjang array dan dimensi yang tersisa.

falsetru
sumber
Dalam hal ini, nilainya disimpulkan menjadi [1, 8]. Dan 8 adalah jumlah total matriks a. Baik?
user2262504
@ user2262504, saya tidak yakin. Saya pikir nilai yang disimpulkan adalah [8]karena dokumentasi mengatakan demikian ( 1-D array). Coba numpy.reshape(a, [8]). Ini menghasilkan hasil yang sama dengan numpy.reshape(a, [1,8])untuk matriks.
falsetru
3
-1 memungkinkan numpy menentukan jumlah kolom atau baris yang tidak diketahui dalam matriks yang dihasilkan. Catatan: yang tidak diketahui harus berupa kolom atau baris, bukan keduanya.
Gathide
15

numpy.reshape (a, newshape, order {}) periksa tautan di bawah untuk informasi lebih lanjut. https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html

untuk contoh di bawah ini Anda menyebutkan output menjelaskan vektor yang dihasilkan menjadi satu baris. (- 1) menunjukkan jumlah baris menjadi 1. jika

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

keluaran:

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

ini dapat dijelaskan lebih tepat dengan contoh lain:

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

output: (adalah array kolom 1 dimensi)

array ([[0],

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

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

output: (adalah array baris 1 dimensi)

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

Dinesh Kumar
sumber
12

Cukup mudah dimengerti. "-1" adalah singkatan dari "dimensi tidak diketahui" yang dapat disimpulkan dari dimensi lain. Dalam hal ini, jika Anda mengatur matriks Anda seperti ini:

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

Ubah matriks Anda seperti ini:

b = numpy.reshape(a, -1)

Ini akan memanggil beberapa operasi tuli untuk matriks a, yang akan mengembalikan 1-d numpy array / martrix.

Namun, saya pikir itu bukan ide yang baik untuk menggunakan kode seperti ini. Kenapa tidak mencoba:

b = a.reshape(1,-1)

Ini akan memberi Anda hasil yang sama dan lebih jelas bagi pembaca untuk memahami: Tetapkan b sebagai bentuk lain dari a. Untuk a, kita tidak berapa banyak kolom yang seharusnya (atur ke -1!), Tetapi kita menginginkan array 1 dimensi (atur parameter pertama menjadi 1!).

F0rge1cE
sumber
9

Singkat cerita : Anda menetapkan beberapa dimensi dan membiarkan NumPy mengatur sisanya.

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

(userDim1, userDim1, ..., TOTAL_DIMENSION - (userDim1 + userDim2 + ...))
Shayan Amani
sumber
Ini adalah jawaban dalam bahasa Inggris yang saya cari, jelas dan sederhana. yaitu Anda memberikan preferensi desain Anda, biarkan numpy menghitung matematika yang tersisa :)
Sumanth Lazarus
6

Ini hanya berarti bahwa Anda tidak yakin tentang jumlah baris atau kolom yang dapat Anda berikan dan Anda meminta numpy untuk menyarankan jumlah kolom atau baris untuk dibentuk kembali.

numpy memberikan contoh terakhir untuk -1 https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html

periksa kode di bawah ini dan hasilnya untuk lebih memahami tentang (-1):

KODE:-

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)

OUTPUT: -

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]]
lonewolf
sumber
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)
Sherzod
sumber
0

Hasil akhir dari konversi adalah bahwa jumlah elemen dalam array akhir sama dengan array awal atau bingkai data.

-1 berhubungan dengan jumlah baris atau kolom yang tidak diketahui. kita dapat menganggapnya sebagai x(tidak diketahui). xdiperoleh dengan membagi jumlah elemen dalam array asli dengan nilai lain dari pasangan yang dipesan dengan -1.

Contohnya

12 elemen dengan membentuk kembali (-1,1) sesuai dengan array dengan x= 12/1 = 12 baris dan 1 kolom.


12 elemen dengan membentuk kembali (1, -1) sesuai dengan array dengan 1 baris dan x= 12/1 = 12 kolom.

deepjyoti22
sumber