6

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

1

У меня возникла проблема с использованием метода .reshape(-1) в Python с библиотекой NumPy. Я пытаюсь преобразовать двумерный массив в одномерный, и вот пример кода:

import numpy as np

a = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
reshaped_array = a.reshape(-1)

Я ожидаю, что результатом будет одномерный массив, содержащий все элементы входного массива. Однако, когда я выполняю a.reshape(-1), результат выглядит так:

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

Хотя я использую -1, которое обычно обозначает последний элемент массива (например, array[-1]), в данном контексте это приводит к неожиданному результату. Мне не совсем понятно, что именно означает -1 в данном случае и как правильно использовать метод .reshape().

Может кто объяснить, как работает этот метод и как правильно его использовать для получения одномерного массива?

5 ответ(ов)

8

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

В библиотеке 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
1

Если у вас есть трехмерный массив размерности 2 x 10 x 10:

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

и вам нужно изменить его форму на 5 x 5 x 8, вы можете использовать функцию numpy.reshape следующим образом:

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

Это сработает.

Обратите внимание, что если вы задали первые два измерения как 5 и 5, то вам не нужно указывать третье измерение. Чтобы упростить эту задачу, Numpy предоставляет возможность использования -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/

0

Функция numpy.reshape(a, newshape, order='C') используется для изменения формы массива a. Когда вы указываете newshape, вы можете использовать -1 для автоматического вычисления необходимого размера. Например, если вы хотите превратить многомерный массив в одномерный, вы можете использовать -1, чтобы указать, что размер по этому измерению должен быть вычислен автоматически.

Рассмотрим ваш пример:

import numpy as np

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

Выходной результат будет:

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

Здесь -1 говорит о том, что вы хотите получить массив с одной строкой, содержащей все элементы исходного массива, т.е. результат представляет собой одномерный массив в виде строки.

Чтобы проиллюстрировать, как работают параметры формы, можно рассмотреть следующие примеры:

  1. Если вы хотите создать столбцовый массив, то можете сделать следующее:
b = np.arange(10).reshape((-1, 1))

Результат будет:

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

Здесь -1 означает, что количество строк будет автоматически вычислено, и результатом будет одномерный массив, представляющий собой столбец.

  1. Если же вы хотите создать строковый массив, воспользуйтесь:
b = np.arange(10).reshape((1, -1))

Выход будет:

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

Здесь 1 указывает на количество строк, а -1 вновь позволит автоматически определить размер по второму измерению, в данном случае, получая одномерный массив в виде строки.

В заключение, использование -1 в reshape облегчает процесс изменения формы массива, позволяя вам сосредоточиться на желаемых размерах без необходимости вручную вычислять остальные размеры.

0

Это просто означает, что вы не уверены, сколько строк или столбцов вы можете задать, и просите NumPy предложить количество строк или столбцов, чтобы изменить форму массива.

NumPy предоставляет последний пример для аргумента -1. Вот ссылка на документацию NumPy.

Рассмотрите следующий код и его вывод, чтобы лучше понять использование -1:

КОД:

import numpy
a = numpy.matrix([[1, 2, 3, 4], [5, 6, 7, 8]])
print("Без изменения формы  -> ")
print(a)
b = numpy.reshape(a, -1)
print("ЗДЕСЬ мы не знаем, какое число следует задать для строк/столбцов")
print("Изменяем форму как (a,-1)")
print(b)
c = numpy.reshape(a, (-1,2))
print("ЗДЕСЬ мы знаем только количество столбцов")
print("Изменяем форму как (a,(-1,2))")
print(c)
d = numpy.reshape(a, (2,-1))
print("ЗДЕСЬ мы знаем только количество строк")
print("Изменяем форму как (a,(2,-1))")
print(d)

ВЫВОД:

Без изменения формы  -> 
[[1 2 3 4]
 [5 6 7 8]]
ЗДЕСЬ мы не знаем, какое число следует задать для строк/столбцов
Изменяем форму как (a,-1)
[[1 2 3 4 5 6 7 8]]
ЗДЕСЬ мы знаем только количество столбцов
Изменяем форму как (a,(-1,2))
[[1 2]
 [3 4]
 [5 6]
 [7 8]]
ЗДЕСЬ мы знаем только количество строк
Изменяем форму как (a,(2,-1))
[[1 2 3 4]
 [5 6 7 8]]

Таким образом, использование -1 позволяет NumPy автоматически вычислить необходимое число строк или столбцов, основываясь на общей размерности массива.

0

-1 обозначает "неизвестное измерение", которое может быть выведено из другого измерения. В этом случае, если вы задаёте вашу матрицу таким образом:

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

Измените вашу матрицу следующим образом:

b = numpy.reshape(a, -1)

Это вызовет некоторые стандартные операции для матрицы a, которые вернут одномерный массив/матрицу numpy.

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

b = a.reshape(1, -1)

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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь