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]
Обе функции возвращают один и тот же список. Тогда зачем нужны две разные функции, выполняющие одну и ту же работу.
python
numpy
multidimensional-array
flatten
numpy-ndarray
cryptomanic
источник
источник
Ответы:
Текущий API таков:
flatten
всегда возвращает копию.ravel
по возможности возвращает вид исходного массива. Это не видно в выводе на печать, но если вы измените массив, возвращаемый ravel, он может изменить записи в исходном массиве. Если вы измените записи в массиве, возвращенном из flatten, этого никогда не произойдет. ravel часто работает быстрее, поскольку память не копируется, но вы должны быть более осторожны при изменении возвращаемого массива.reshape((-1,))
получает представление всякий раз, когда шаги массива позволяют это, даже если это означает, что вы не всегда получаете непрерывный массив.источник
a.flatten()
должен обязательно получать копию,a.ravel()
чтобы избежать большинство копий, но все же гарантируют, что возвращаемый массив является смежным, иa.reshape((-1,))
действительно получает представление, когда шаги массива позволяют это, даже если это означает, что вы не всегда получаете смежный массив.ravel
гарантирует непрерывный массив, и поэтому не гарантируется, что он возвращает представление;reshape
всегда возвращает представление, и поэтому не гарантируется, что он возвращает непрерывный массив.reshape(-1)
эквивалентноreshape((-1,))
Как объясняется здесь, ключевое отличие состоит в том, что:
flatten
является методом ndarray-объекта и, следовательно, может быть вызван только для истинных numpy массивов.ravel
является функцией уровня библиотеки и, следовательно, может вызываться для любого объекта, который может быть успешно проанализирован.Например,
ravel
будет работать со списком ndarrays, покаflatten
не доступен для этого типа объекта.@IanH также указывает на важные различия с обработкой памяти в своем ответе.
источник
ndarray
«SВот правильное пространство имен для функций:
numpy.ndarray.flatten
numpy.ravel
Обе функции возвращают сглаженные одномерные массивы, указывающие на новые структуры памяти.
В верхнем примере:
Как мы проверяем, является ли что-то копией? Используя
.base
атрибутndarray
. Если это представление, база будет исходным массивом; если это копия, база будетNone
.источник