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).

Share:
13,039

Related videos on Youtube

Neil G
Author by

Neil G

Interested in machine learning and Python.

Updated on September 15, 2022

Comments

  • Neil G
    Neil G over 1 year

    What are the advantages and disadvantages of storing Python objects in a numpy.array with dtype='o' versus using list (or list of list, 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
      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 nested zip's and map's.
    • NPE
      NPE
      I 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
    Neil G almost 11 years
    Also, you can use numpy helpers like flat, flatten, nditer
  • Neil G
    Neil G almost 7 years
    I 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.