Python: Differences between lists and numpy array of objects
13,039
Slicing works differently with NumPy arrays. The NumPy docs devote a lengthy page on the topic. To highlight some points:
- NumPy slices can slice through multiple dimensions
- All arrays generated by NumPy basic slicing are always views of the original array, while slices of lists are shallow copies.
- You can assign a scalar into a NumPy slice.
- You can insert and delete items in a
list
by assigning a sequence of different length to a slice, whereas NumPy would raise an error.
Demo:
>>> a = np.arange(4, dtype=object).reshape((2,2))
>>> a
array([[0, 1],
[2, 3]], dtype=object)
>>> a[:,0] #multidimensional slicing
array([0, 2], dtype=object)
>>> b = a[:,0]
>>> b[:] = True #can assign scalar
>>> a #contents of a changed because b is a view to a
array([[True, 1],
[True, 3]], dtype=object)
Also, NumPy arrays provide convenient mathematical operations with arrays of objects that support them (e.g. fraction.Fraction
).
Related videos on Youtube
Comments
-
Neil G over 1 year
What are the advantages and disadvantages of storing Python objects in a
numpy.array
withdtype='o'
versus usinglist
(orlist
oflist
, etc., in higher dimensions)?Are numpy arrays more efficient in this case? (It seems that they cannot avoid the indirection, but might be more efficient in the multidimensional case.)
-
Jaime almost 11 years@NPE I mostly agree, other than as a convenient way to do (some) mathematical operations with arrays of
Fraction
objects (or the like), without resorting to half a dozen nestedzip
's andmap
's. -
NPEI personally have never come across compelling uses for NumPy arrays of objects. It would be interesting to see if someone can come up with a convincing example. (+1)
-
-
Neil G almost 11 yearsAlso, you can use numpy helpers like
flat
,flatten
,nditer
-
Neil G almost 7 yearsI wasn't asking about arrays of numbers. I was asking about arrays of objects. And I don't know that Python lists need more memory or are slower. After all, they're both just contiguous arrays underneath.