What is the difference between flatten and ravel functions in numpy?
Rise to the top 3% as a developer or hire one of them at Toptal: https://topt.al/25cXVn
--------------------------------------------------
Music by Eric Matyas
https://www.soundimage.org
Track title: Ominous Technology Looping
--
Chapters
00:00 What Is The Difference Between Flatten And Ravel Functions In Numpy?
00:19 Accepted Answer Score 546
01:02 Answer 2 Score 90
01:33 Answer 3 Score 33
02:25 Thank you
--
Full question
https://stackoverflow.com/questions/2893...
--
Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...
--
Tags
#python #numpy #multidimensionalarray #flatten #numpyndarray
#avk47
ACCEPTED ANSWER
Score 556
The current API is that:
flattenalways returns a copy.ravelreturns a contiguous view of the original array whenever possible. This isn't visible in the printed output, but if you modify the array returned by ravel, it may modify the entries in the original array. If you modify the entries in an array returned from flatten this will never happen. ravel will often be faster since no memory is copied, but you have to be more careful about modifying the array it returns.reshape((-1,))gets a view whenever the strides of the array allow it even if that means you don't always get a contiguous array.
ANSWER 2
Score 91
As explained here a key difference is that:
flattenis a method of an ndarray object and hence can only be called for true numpy arrays.ravelis a library-level function and hence can be called on any object that can successfully be parsed.
For example ravel will work on a list of ndarrays, while flatten is not available for that type of object.
@IanH also points out important differences with memory handling in his answer.
ANSWER 3
Score 33
Here is the correct namespace for the functions:
Both functions return flattened 1D arrays pointing to the new memory structures.
import numpy
a = numpy.array([[1,2],[3,4]])
r = numpy.ravel(a)
f = numpy.ndarray.flatten(a)
print(id(a))
print(id(r))
print(id(f))
print(r)
print(f)
print("\nbase r:", r.base)
print("\nbase f:", f.base)
---returns---
140541099429760
140541099471056
140541099473216
[1 2 3 4]
[1 2 3 4]
base r: [[1 2]
[3 4]]
base f: None
In the upper example:
- the memory locations of the results are different,
- the results look the same
- flatten would return a copy
- ravel would return a view.
How we check if something is a copy?
Using the .base attribute of the ndarray. If it's a view, the base will be the original array; if it is a copy, the base will be None.
Check if a2 is copy of a1
import numpy
a1 = numpy.array([[1,2],[3,4]])
a2 = a1.copy()
id(a2.base), id(a1.base)
Out:
(140735713795296, 140735713795296)