Что означает -1 в numpy rehape?

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]означает последний элемент. Можете ли вы дать объяснение?

user2262504
источник

Ответы:

569

Критерий для предоставления новой формы заключается в том, что «новая форма должна быть совместима с исходной формой»

Numpy позволяет нам задать один из новых параметров формы как -1 (например: (2, -1) или (-1,3), но не (-1, -1)). Это просто означает, что это неизвестное измерение, и мы хотим, чтобы numpy понял это. И 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
По моему мнению, принятый ответ и этот ответ являются полезными, в то время как принятый ответ является более простым, я предпочитаю более простой ответ
облачные вычисления
1
Как форма (12, 1) «совместима» с формой (3,4)?
Виджендер
1
@ Виджендер Я думаю, это означает, что одинаковое количество элементов, но разные оси - то есть 12x1 == 3x4?
Дэвид Уотерворт
80

Используется для изменения формы массива.

Скажем, у нас есть трехмерный массив размеров 2 x 10 x 10:

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

Теперь мы хотим изменить до 5 х 5 х 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:

newshape: int или кортеж целых

Новая форма должна быть совместима с оригинальной формой. Если целое число, то результатом будет одномерный массив этой длины. Одно измерение формы может быть -1. В этом случае значение выводится из длины массива и оставшихся измерений.

falsetru
источник
В этом случае значение определяется как [1, 8]. И 8 - общее количество матрицы а. правильно?
user2262504 9.09.13
@ user2262504, я не уверен. Я думаю, что предполагаемая ценность заключается в том, [8]что в документации так сказано ( 1-D array). Попробуй numpy.reshape(a, [8]). Это дает тот же результат, что и numpy.reshape(a, [1,8])для матрицы.
Falsetru
3
-1 позволяет numpy определить для вас неизвестное количество столбцов или строк в результирующей матрице. Примечание: неизвестное должно быть столбцами или строками, а не обоими.
Гатиде
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))

вывод: (это одномерный столбчатый массив)

Массив ([[0],

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

b = np.arange (10) .reshape ((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-й массив numpy / martrix.

Однако я не думаю, что это хорошая идея использовать такой код. Почему бы не попробовать:

b = a.reshape(1,-1)

Это даст вам тот же результат, и читателям будет более понятно: установите b в качестве другой формы a. Например, мы не знаем, сколько столбцов должно быть (установите его в -1!), Но нам нужен одномерный массив (установите первый параметр в 1!).

F0rge1cE
источник
9

Короче говоря : вы устанавливаете некоторые размеры и позволяете NumPy устанавливать остальные.

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

(userDim1, userDim1, ..., TOTAL_DIMENSION - (userDim1 + userDim2 + ...))
Шаян Амани
источник
Это ответ на английском, который я искал, простой и понятный. то есть вы
отдаете
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получается делением количества элементов в исходном массиве на другое значение упорядоченной пары с -1.

Примеры

12 элементов с изменением формы (-1,1) соответствуют массиву с x= 12/1 = 12 строк и 1 столбец.


12 элементов с изменением формы (1, -1) соответствует массиву с 1 строкой и x= 12/1 = 12 столбцов.

deepjyoti22
источник