2015-03-08 3 views
150
import numpy as np 
y = np.array(((1,2,3),(4,5,6),(7,8,9))) 
OUTPUT: 
print(y.flatten()) 
[1 2 3 4 5 6 7 8 9] 
print(y.ravel()) 
[1 2 3 4 5 6 7 8 9] 

Обе функции возвращают тот же список. Тогда в чем нуждаются две разные функции, выполняющие ту же работу.В чем разница между функциями flatten и ravel в numpy?

+10

Ravel обычно возвращает вид в существующий массив (иногда он возвращает копию). Flatten возвращает новый массив. – Alex

+3

Возможный дубликат [В чем разница между сглаживанием и ravel в numpy?] (Http://stackoverflow.com/questions/28837312/what-is-the-difference-between-flatten-and-ravel-in-numpy) – finnw

ответ

207

В настоящее время API является то, что:

  • flatten всегда возвращает копию.
  • ravel возвращает вид исходного массива, когда это возможно. Это не видно на распечатанном выходе, но если вы измените массив, возвращаемый ravel, он может изменить записи в исходном массиве. Если вы измените записи в массиве, возвращенном из сглаживания, этого никогда не произойдет. ravel часто будет быстрее, поскольку память не копируется, но вы должны быть более осторожны в изменении массива, который он возвращает.
  • reshape((-1,)) получает представление, когда шаги массива позволяют это сделать, даже если это означает, что вы не всегда получаете непрерывный массив.
+10

Любая идея, почему разработчики NumPy не придерживались одной функции с некоторым параметром copy = [True, False]? –

+0

@FranckDernoncourt Отличный вопрос. Понятия не имею. Единственная причина, по которой я могу думать, - это предоставить простой аналог аналогичной команде matlab. У него нет прецедента в numarray или numeric. – IanH

+18

Гарантии Backcompat иногда вызывают странные вещи, подобные этому. Например: недавно создатели numpy (в 1.10) добавили ранее неявную гарантию того, что ravel вернет непрерывный массив (свойство, которое очень важно при написании расширений C), поэтому теперь API является 'a.flatten()', чтобы получить Скорее всего, 'a.ravel()', чтобы избежать большинства копий, но все же гарантировать, что возвращаемый массив является смежным, и 'a.reshape ((- 1,))', чтобы действительно получить представление всякий раз, когда шаги массива разрешите это, даже если это означает, что вы не всегда получаете смежный массив. – IanH

13

Как объяснено here основное различие в том, что flatten представляет собой метод с ndarray объекта и, следовательно, может быть вызван только для истинных Numpy массивов. Напротив, ravel() - это функция уровня библиотеки и, следовательно, может быть вызвана на любой объект, который может быть успешно проанализирован. Например, ravel() будет работать над списком ndarrays, тогда как flatten недоступен для этого типа объекта.

@IanH также указывает важные отличия с обработкой памяти в его ответе.

Смежные вопросы