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.)
2 Answers 2
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
).
-
Also, you can use numpy helpers like
flat
,flatten
,nditer
Neil G– Neil G2013年04月12日 06:01:19 +00:00Commented Apr 12, 2013 at 6:01
Numpy is less memory use than a Python list. Also Numpy is faster and more convenient than a list.
For example: if you want to add two lists in Python you have to do looping over all element in the list. On the other hand in Numpy you just add them.
# adding two lists in python
sum = []
l1 = [1, 2, 3]
l2 = [2, 3, 4]
for i in range(len(l1)):
print sum.append(l1[i]+l2[i])
# adding in numpy
a1 = np.arange(3)
a2 = np.arange(3)
sum2 = a1+a2
print sum2
-
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.Neil G– Neil G2017年04月20日 01:53:40 +00:00Commented Apr 20, 2017 at 1:53
Fraction
objects (or the like), without resorting to half a dozen nestedzip
's andmap
's.