Що означає -1 в нумерованій формі?


420

Маточну матрицю можна переробити у вектор, використовуючи функцію перестановки з параметром -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? І, схоже, python присвоює -1 кілька значень, таких як: array[-1]означає останній елемент. Чи можете ви дати пояснення?

Відповіді:


567

Критерій, який слід задовольнити для надання нової форми, полягає в тому, що "Нова форма повинна бути сумісною з початковою формою"

numpy дозволяють дати один з нових параметрів форми як -1 (наприклад: (2, -1) або (-1,3), але не (-1, -1)). Це просто означає, що це невідомий вимір, і ми хочемо нуме розібратися в цьому. І numpy визначить це, переглянувши "довжину масиву та залишки розмірів" і переконавшись, що він відповідає вищезгаданим критеріям

Тепер дивіться приклад.

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). Сумісний з оригінальною формою (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
На мою думку, прийнята відповідь і ця відповідь є корисними, тоді як прийнята відповідь простіша, я вважаю за краще простішу відповідь
cloudcomputes

1
Як форма (12, 1) "сумісна" з формою (3,4)?
Vijender

1
@Vijender Я думаю, це означає однакову кількість елементів, але різну вісь - тобто 12x1 == 3x4?
Девід Уотерворт

80

Використовується для перестановки масиву.

Скажімо, у нас є тривимірний масив розмірами 2 х 10 х 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 дає можливість -1:

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:

редактор новин: int або кортеж ints

Нова форма повинна бути сумісною з оригінальною формою. Якщо ціле число, то результатом буде 1-D масив такої довжини. Один розмір форми може бути -1. У цьому випадку значення виводиться з довжини масиву та інших розмірів.


У цьому випадку значення вважається рівним [1, 8]. І 8 - загальна кількість матриці a. правильно?
користувач2262504

@ user2262504, я не впевнений. Я думаю, що отримане значення полягає в [8]тому, що в документації так написано ( 1-D array). Спробуйте numpy.reshape(a, [8]). Це дає такий же результат, як і numpy.reshape(a, [1,8])для матриці.
фальсетру

3
-1 дозволяє numpy визначити для вас невідому кількість стовпців або рядків у отриманій матриці. Примітка: невідомі повинні бути або стовпцями, або рядками, а не обома.
Gathide

15

numpy.reshape (a, форма новин, замовлення {}) перегляньте посилання нижче для отримання додаткової інформації. 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) .форма (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 масив / матрицю.

Однак я не думаю, що використовувати такий код добре. Чому б не спробувати:

b = a.reshape(1,-1)

Це дасть вам такий же результат, і читачі зрозуміліше зрозуміють: Встановіть b як іншу форму а. Для a, ми не маємо, скільки стовпців він повинен мати (встановити його на -1!), Але ми хочемо масив 1 розміру (встановіть перший параметр на 1!).


9

Короткий огляд короткого оповідання : ви задаєте деякі параметри і дозволите NumPy встановити решту (і).

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

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

Це відповідь англійською мовою, яку я шукав, просту та просту. тобто ти надаєш перевагу дизайну, нехай нупі опрацює решту математики :)
Sumanth Lazarus

6

Це просто означає, що ви не впевнені в тому, яку кількість рядків або стовпців ви можете надати, і ви просите numpy запропонувати кількість стовпців або рядків, щоб їх змінити.

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отримується діленням umber елементів у вихідному масиві на інше значення впорядкованої пари на -1.

Приклади

12 елементів з перестановкою (-1,1) відповідає масиву x= 12/1 = 12 рядків і 1 стовпчик.


12 елементів із перестановкою (1, -1) відповідає масиву з 1 рядком і x= 12/1 = 12 стовпців.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.