-1 หมายความว่าอย่างไรในการปรับรูปร่างแบบ numpy


420

เมทริกซ์ numpy สามารถปรับเปลี่ยนเป็นเวกเตอร์โดยใช้ฟังก์ชัน reshape กับพารามิเตอร์ -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)) มันหมายถึงว่ามันเป็นมิติที่ไม่รู้จักและเราต้องการให้ผู้ใช้เข้าใจมัน และจำนวนจะคำนวณโดยดูที่ 'ความยาวของอาเรย์และขนาดที่เหลืออยู่'และตรวจสอบให้แน่ใจว่าเป็นไปตามเกณฑ์ที่กล่าวมาข้างต้น

ตอนนี้ดูตัวอย่าง

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 แต่ไม่ทราบแถว ดังนั้นเราจึงได้รูปร่างใหม่ผลลัพธ์เป็น (12, 1) .again เข้ากันได้กับรูปร่างดั้งเดิม (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

ใช้ในการก่อร่างใหม่อาร์เรย์

สมมติว่าเรามีมิติข้อมูล 3 มิติ 2 x 10 x 10:

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

ตอนนี้เราต้องการที่จะก่อร่างใหม่เป็น 5 X 5 x 8:

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

จะทำงาน

โปรดทราบว่าเมื่อคุณแก้ไขข้อแรก dim = 5 และ dim ครั้งที่สอง = 5 คุณไม่จำเป็นต้องกำหนดส่วนที่สาม เพื่อช่วยให้คุณรู้สึกเกียจคร้าน python มีตัวเลือกดังนี้:

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: int หรือ tuple ของ ints

รูปร่างใหม่ควรเข้ากันได้กับรูปร่างดั้งเดิม ถ้าจำนวนเต็มผลลัพธ์จะเป็นอาร์เรย์ 1-D ของความยาวนั้น มิติรูปร่างหนึ่งสามารถเป็น-1 ในกรณีนี้ค่าจะอนุมานจากความยาวของอาร์เรย์และขนาดที่เหลือ


ในกรณีนี้ค่าจะอนุมานเป็น [1, 8] และ 8 คือจำนวนเมทริกซ์ทั้งหมด ขวา?
2262504

@ 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) .reshape ((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 ซึ่งจะส่งกลับอาร์เรย์ 1-d numpy / martrix

อย่างไรก็ตามฉันไม่คิดว่ามันเป็นความคิดที่ดีที่จะใช้รหัสเช่นนี้ ทำไมไม่ลอง:

b = a.reshape(1,-1)

มันจะให้ผลลัพธ์ที่เหมือนกันและชัดเจนยิ่งขึ้นสำหรับผู้อ่านที่จะเข้าใจ: ตั้งค่า b เป็นรูปร่างอื่น สำหรับ a เราไม่ควรมีคอลัมน์เท่าใด (ตั้งค่าเป็น -1!) แต่เราต้องการอาร์เรย์ 1 มิติ (ตั้งค่าพารามิเตอร์แรกเป็น 1!)


9

เรื่องสั้นสั้น : คุณตั้งค่าบางส่วนและให้ NumPy ตั้งค่าส่วนที่เหลือ

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

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

นี่คือคำตอบในภาษาอังกฤษที่ฉันกำลังมองหาธรรมดาและเรียบง่าย เช่นคุณให้การตั้งค่าการออกแบบของคุณปล่อยให้ numpy
Sumanth Lazarus

6

หมายความว่าคุณไม่แน่ใจเกี่ยวกับจำนวนแถวหรือคอลัมน์ที่คุณสามารถให้และคุณจะขอให้แนะนำจำนวนคอลัมน์หรือแถวเพื่อเปลี่ยนรูปร่าง

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

ตัวอย่าง

12 องค์ประกอบที่มีการก่อร่างใหม่ (-1,1) สอดคล้องกับอาร์เรย์ที่มีx= 12/1 = 12 แถวและ 1 คอลัมน์


12 องค์ประกอบที่มีการก่อร่างใหม่ (1, -1) สอดคล้องกับอาร์เรย์ที่มี 1 แถวและx= 12/1 = 12 คอลัมน์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.