Что означает -1 в reshape numpy?
У меня возникла проблема с использованием метода .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 ответ(ов)
Критерий, который необходимо выполнить для задания новой формы массива, заключается в том, что "новая форма должна быть совместима с изначальной формой".
В библиотеке 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
Если у вас есть трехмерный массив размерности 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/
Функция 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
говорит о том, что вы хотите получить массив с одной строкой, содержащей все элементы исходного массива, т.е. результат представляет собой одномерный массив в виде строки.
Чтобы проиллюстрировать, как работают параметры формы, можно рассмотреть следующие примеры:
- Если вы хотите создать столбцовый массив, то можете сделать следующее:
b = np.arange(10).reshape((-1, 1))
Результат будет:
array([[0],
[1],
[2],
[3],
[4],
[5],
[6],
[7],
[8],
[9]])
Здесь -1
означает, что количество строк будет автоматически вычислено, и результатом будет одномерный массив, представляющий собой столбец.
- Если же вы хотите создать строковый массив, воспользуйтесь:
b = np.arange(10).reshape((1, -1))
Выход будет:
array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
Здесь 1
указывает на количество строк, а -1
вновь позволит автоматически определить размер по второму измерению, в данном случае, получая одномерный массив в виде строки.
В заключение, использование -1
в reshape
облегчает процесс изменения формы массива, позволяя вам сосредоточиться на желаемых размерах без необходимости вручную вычислять остальные размеры.
Это просто означает, что вы не уверены, сколько строк или столбцов вы можете задать, и просите 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 автоматически вычислить необходимое число строк или столбцов, основываясь на общей размерности массива.
-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!).
Как вывести полный массив NumPy без обрезки?
Как получить доступ к i-му столбцу многомерного массива NumPy?
Преобразование DataFrame Pandas в массив NumPy
Существует ли функция NumPy для возврата первого индекса элемента в массиве?
Как подсчитать количество вхождений определенного элемента в ndarray?