-1 có nghĩa là gì trong việc định hình lại numpy?


420

Một ma trận numpy có thể được định hình lại thành một vectơ bằng cách sử dụng hàm định hình lại với tham số -1. Nhưng tôi không biết -1 có nghĩa là gì ở đây.

Ví dụ:

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

Kết quả blà:matrix([[1, 2, 3, 4, 5, 6, 7, 8]])

Có ai biết -1 có nghĩa là gì ở đây không? Và có vẻ như python gán -1 một số ý nghĩa, chẳng hạn như: array[-1]có nghĩa là phần tử cuối cùng. Bạn có thể đưa ra một lời giải thích?

Câu trả lời:


567

Tiêu chí để đáp ứng cho việc cung cấp hình dạng mới là 'Hình dạng mới phải tương thích với hình dạng ban đầu'

numpy cho phép chúng ta đưa ra một trong các tham số hình dạng mới là -1 (ví dụ: (2, -1) hoặc (-1,3) nhưng không (-1, -1)). Nó đơn giản có nghĩa là nó là một chiều không xác định và chúng tôi muốn numpy để tìm ra nó. Và numpy sẽ chỉ ra điều này bằng cách xem xét 'độ dài của mảng và các kích thước còn lại' và đảm bảo rằng nó thỏa mãn các tiêu chí đã đề cập ở trên

Bây giờ xem ví dụ.

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

Bây giờ cố gắng định hình lại với (-1). Kết quả hình dạng mới là (12,) và tương thích với hình dạng ban đầu (3,4)

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

Bây giờ cố gắng định hình lại với (-1, 1). Chúng tôi đã cung cấp cột là 1 nhưng hàng không xác định. Vì vậy, chúng tôi nhận được kết quả hình dạng mới là (12, 1) .chỉ tương thích với hình dạng ban đầu (3,4)

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

Ở trên phù hợp với thông báo numpylời khuyên / lỗi, để sử dụng reshape(-1,1)cho một tính năng duy nhất; tức là cột đơn

Định hình lại dữ liệu của bạn bằng cách sử dụng array.reshape(-1, 1)nếu dữ liệu của bạn có một tính năng duy nhất

Hình dạng mới như (-1, 2). hàng không xác định, cột 2. chúng tôi nhận được kết quả hình dạng mới là (6, 2)

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

Bây giờ cố gắng giữ cột như không biết. Hình dạng mới như (1, -1). tức là hàng là 1, cột không xác định. chúng ta có kết quả hình dạng mới là (1, 12)

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

Ở trên phù hợp với thông báo numpylời khuyên / lỗi, để sử dụng reshape(1,-1)cho một mẫu duy nhất; tức là hàng đơn

Định hình lại dữ liệu của bạn bằng cách sử dụng array.reshape(1, -1)nếu nó chứa một mẫu

Hình dạng mới (2, -1). Hàng 2, cột không rõ. chúng ta có kết quả hình dạng mới là (2,6)

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

Hình dạng mới như (3, -1). Hàng 3, cột không rõ. chúng ta có kết quả hình dạng mới là (3,4)

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

Và cuối cùng, nếu chúng ta cố gắng cung cấp cả hai chiều là không xác định, tức là hình dạng mới là (-1, -1). Nó sẽ ném một lỗi

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

11
Câu trả lời này chứa rất nhiều ví dụ nhưng không đưa ra những gì -1 làm bằng tiếng Anh. Khi định hình lại một mảng, hình dạng mới phải chứa cùng số lượng phần tử với hình dạng cũ, nghĩa là các sản phẩm có kích thước của hai hình dạng phải bằng nhau. Khi sử dụng -1, kích thước tương ứng với -1 sẽ là tích của các kích thước của mảng ban đầu chia cho sản phẩm của các kích thước được cung cấp reshapeđể duy trì cùng số lượng phần tử.
BallpointBen

1
Theo tôi, câu trả lời được chấp nhận và câu trả lời này đều hữu ích, trong khi câu trả lời được chấp nhận đơn giản hơn, tôi thích câu trả lời đơn giản hơn
đám mây

1
Hình dạng (12, 1) "tương thích" với hình dạng (3,4) như thế nào?
Vijender

1
@Vijender Tôi đoán nó có nghĩa là cùng một số phần tử nhưng trục khác nhau - tức là 12x1 == 3x4?
David Waterworth

80

Được sử dụng để định hình lại một mảng.

Giả sử chúng ta có một mảng 3 chiều có kích thước 2 x 10 x 10:

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

Bây giờ chúng tôi muốn định hình lại thành 5 X 5 x 8:

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

sẽ làm việc

Lưu ý rằng, khi bạn sửa đầu tiên dim = 5 và thứ hai dim = 5, bạn không cần xác định thứ ba. Để hỗ trợ sự lười biếng của bạn, python cung cấp tùy chọn -1:

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

sẽ cung cấp cho bạn một mảng hình dạng = (5, 5, 8).

Tương tự như vậy,

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

sẽ cung cấp cho bạn một mảng hình dạng = (50, 4)

Bạn có thể đọc thêm tại http://anie.me/numpy-reshape-transpose-theano-dimshuffle/


59

Theo the documentation:

newshape: int hoặc tuple của ints

Hình dạng mới phải tương thích với hình dạng ban đầu. Nếu là một số nguyên, thì kết quả sẽ là mảng 1-D có độ dài đó. Một chiều hình có thể là -1. Trong trường hợp này, giá trị được suy ra từ chiều dài của mảng và các kích thước còn lại.


Trong trường hợp này, giá trị được suy ra là [1, 8]. Và 8 là tổng số ma trận a. đúng?
dùng2262504

@ user2262504, tôi không chắc. Tôi nghĩ rằng giá trị suy ra là [8]bởi vì tài liệu nói như vậy ( 1-D array). Hãy thử numpy.reshape(a, [8]). Nó mang lại kết quả tương tự với numpy.reshape(a, [1,8])ma trận.
falsetru

3
-1 cho phép numpy xác định cho bạn số lượng cột hoặc hàng chưa biết trong ma trận kết quả. Lưu ý: ẩn số phải là cột hoặc hàng, không phải cả hai.
Gathide

15

numpy.reshape (a, newshape, order {}) kiểm tra liên kết dưới đây để biết thêm. https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html

với ví dụ dưới đây bạn đã đề cập, đầu ra giải thích vectơ kết quả là một hàng đơn. (- 1) cho biết số lượng hàng là 1. nếu

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

đầu ra:

ma trận ([[1, 2, 3, 4, 5, 6, 7, 8]])

điều này có thể được giải thích chính xác hơn với một ví dụ khác:

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

đầu ra: (là mảng cột 1 chiều)

mảng ([[0],

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

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

đầu ra: (là mảng hàng 1 chiều)

mảng ([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])


12

Nó khá dễ hiểu. "-1" là viết tắt của "kích thước không xác định" có thể được suy ra từ chiều khác. Trong trường hợp này, nếu bạn đặt ma trận của mình như thế này:

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

Sửa đổi ma trận của bạn như thế này:

b = numpy.reshape(a, -1)

Nó sẽ gọi một số phép toán điếc cho ma trận a, nó sẽ trả về một mảng / martrix 1-d numpy.

Tuy nhiên, tôi không nghĩ nên sử dụng mã như thế này. Sao không thử nhỉ:

b = a.reshape(1,-1)

Nó sẽ cho bạn kết quả tương tự và người đọc hiểu rõ hơn: Đặt b là một hình dạng khác của a. Đối với a, chúng tôi không nên có bao nhiêu cột (đặt thành -1!), Nhưng chúng tôi muốn một mảng 1 chiều (đặt tham số đầu tiên thành 1!).


9

Câu chuyện dài : bạn đặt một số thứ nguyên và để NumPy đặt (các) phần còn lại.

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

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

Đây là câu trả lời bằng tiếng Anh tôi đang tìm kiếm, đơn giản và đơn giản. tức là bạn đưa ra sở thích thiết kế của mình, hãy để công việc toán học còn lại :)
Sumanth Lazarus

6

Điều đó chỉ có nghĩa là bạn không chắc chắn về số lượng hàng hoặc cột bạn có thể cung cấp và bạn đang yêu cầu numpy để đề xuất số lượng cột hoặc hàng để được định hình lại.

numpy cung cấp ví dụ cuối cùng cho -1 https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html

kiểm tra mã bên dưới và đầu ra của nó để hiểu rõ hơn về (-1):

MÃ:

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)

ĐẦU RA: -

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

Kết quả cuối cùng của việc chuyển đổi là số lượng phần tử trong mảng cuối cùng giống với số lượng của mảng hoặc khung dữ liệu ban đầu.

-1 tương ứng với số lượng chưa biết của hàng hoặc cột. chúng ta có thể nghĩ về nó như x(chưa biết). xthu được bằng cách chia số lượng các phần tử trong mảng ban đầu cho giá trị khác của cặp theo thứ tự với -1.

Ví dụ

12 phần tử với định hình lại (-1,1) tương ứng với một mảng có x= 12/1 = 12 hàng và 1 cột.


12 phần tử với định hình lại (1, -1) tương ứng với một mảng có 1 hàng và x= 12/1 = 12 cột.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.