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

Матрица 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? И кажется, что python присваивает -1 несколько значений, например: array[-1] означает последний элемент. Можете ли вы дать объяснение?

+309
источник поделиться
7 ответов

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

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]])

reshape(-1,1) согласуется с 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
+408
источник

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

Скажем, у нас есть трехмерный массив размеров 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 предоставляет опцию -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/

+69
источник

Согласно the documentation:

newshape: int или кортеж ints

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

+56
источник

numpy.reshape(а, newshape, порядок {}) проверьте приведенную ниже ссылку для получения дополнительной информации. 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))

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

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

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

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

output: (представляет собой массив 1-мерной строки)

массив ([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])

+14
источник

Это довольно легко понять. "-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!).

+12
источник

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

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

(userDim1, userDim1, ..., TOTAL_DIMENSION - (userDim1 + userDim2 + ...))
+7
источник

Я упомянул здесь учебник по изменению формы:

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

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос