Python:列表和NumPy对象数组之间的区别

19
在使用Python中的numpy.array时,将Python对象以dtype='o'的形式存储与使用列表(或更高维度的列表等)相比有哪些优缺点?numpy数组在这种情况下是否更高效?(似乎它们无法避免间接性,但在多维情况下可能更高效。)

1
我个人从未遇到过对NumPy对象数组的强制使用。有趣的是,看看是否有人能够提出一个令人信服的例子。 (+1) - NPE
可能是 https://dev59.com/pFfUa4cB1Zd3GeqPJpxj 的重复问题。 - tiago
2
@NPE 我大多数都同意,除了作为一种方便的方式使用Fraction对象数组(或类似对象)做一些数学运算,而不需要使用半打嵌套的zipmap - Jaime
@NPE NodePy 使用NumPy对象数组(sympy表达式)来进行ODE数值方法的精确分析。 - jorgeca
2个回答

12

在NumPy数组中,切片操作与普通Python列表不同。NumPy文档专门有一篇详细介绍该主题的文章。以下是其中的几点要点:

  • NumPy切片可以跨越多个维度。
  • 由NumPy基本切片生成的所有数组都是原始数组的视图,而列表的切片是浅拷贝。
  • 您可以在NumPy切片中分配一个标量值。
  • 您可以通过将不同长度的序列分配给切片来在list中插入和删除元素,而这样做会导致NumPy引发错误。

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)    

此外,NumPy数组提供了方便的数学操作,可以对支持它们的对象数组(例如fraction.Fraction)进行操作。


此外,您还可以使用numpy助手,如flatflattennditer - Neil G

0

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

我不是在问数字数组,而是在问对象数组。我也不知道Python列表是否需要更多的内存或者更慢。毕竟,它们都只是底层连续的数组。 - Neil G

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接