【问题标题】:Python: Differences between lists and numpy array of objectsPython:列表和对象的numpy数组之间的差异
【发布时间】:2013-04-11 08:35:42
【问题描述】:

numpy.arraydtype='o' 中存储Python 对象与使用list(或listlist 等,在更高维度上)的优缺点是什么?

在这种情况下,numpy 数组是否更有效? (似乎他们无法避免间接,但在多维情况下可能更有效。)

【问题讨论】:

  • 我个人从未遇到过 NumPy objects 数组的引人注目的用途。看看有人能想出一个令人信服的例子会很有趣。 (+1)
  • @NPE 我大多同意,除了作为对 Fraction 对象(或类似)数组进行(某些)数学运算的便捷方式,无需求助于六个嵌套 zip的和map 的。
  • @NPE NodePy 使用 NumPy 对象数组(sympy 表达式)对 ODE 的数值方法进行一些精确分析。

标签: python numpy


【解决方案1】:

切片与 NumPy 数组的工作方式不同。 The NumPy docs devote a lengthy page on the topic.强调几点:

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

【讨论】:

  • 另外,你可以使用像flatflattennditer这样的numpy助手
【解决方案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

【讨论】:

  • 我问的不是数字数组。我在问对象数组。而且我不知道 Python 列表需要更多内存还是更慢。毕竟,它们都是下面的连续数组。
猜你喜欢
  • 2011-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-07
  • 1970-01-01
  • 2012-03-10
  • 2017-10-14
  • 1970-01-01
相关资源
最近更新 更多