Python: различия между списками и массивом объектов numpy

Каковы преимущества и недостатки хранения объектов Python в numpy.array с dtype='o' по сравнению с использованием list (или list of list и т.д. в более высоких измерениях)?

Являются ли массивы numpy более эффективными в этом случае? (Похоже, что они не могут избежать косвенности, но могут быть более эффективными в многомерном случае.)

Ответ 1

Нарезка работает по-разному с массивами NumPy. Документы NumPy посвящают длительную страницу по теме. Чтобы выделить некоторые моменты:

  • Наборы NumPy могут срезать несколько измерений
  • Все массивы, созданные базовой средой NumPy, всегда представляют собой вид исходного массива, а фрагменты списков - мелкие.
  • Вы можете назначить скаляр в срез NumPy.
  • Вы можете вставлять и удалять элементы в list, назначая последовательность разной длины срезу, тогда как NumPy вызывает ошибку.

Демо:

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

Кроме того, массивы NumPy обеспечивают удобные математические операции с массивами объектов, которые их поддерживают (например, fraction.Fraction).

Ответ 2

Numpy меньше использования памяти, чем список Python. Также Numpy быстрее и удобнее, чем список.

Например: если вы хотите добавить два списка в Python, вам нужно выполнить цикл по всему элементу в списке. С другой стороны, в Numpy вы просто добавляете их.

# 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