在numpy中使用ndim 1或2向量是否有任何性能原因?

时间:2016-09-20 09:50:48

标签: python numpy vector

这似乎是一个非常基本的问题,但我没有在堆栈上找到与它相关的任何内容。如果我错过了现有的问题,请道歉。

我已经看到了一些数学/线性代数的原因,为什么人们可能想要使用numpy向量“正确”(即ndim 1),而不是行/列向量(即ndim 2)。

但是现在我想知道:为什么有人可能选择其中一个(强效)效率的理由?或者在这方面选择几乎是武断的?

(编辑)澄清:“ndim 1 vs ndim 2 vectors”我的意思是代表一个包含数字3和4的向量:

  • np.array([3,4])#ndim 1

  • np.array([[3,4]])#ndim 2

numpy文档似乎倾向于将第一种情况作为默认情况,但就像我说的那样,我想知道是否存在任何性能差异。

1 个答案:

答案 0 :(得分:2)

如果你正确使用numpy,那么不 - 这不是一个考虑因素。

如果查看numpy internals documentation,就可以看到

  

Numpy数组由两个主要组件组成,即原始数组数据(从现在开始,称为数据缓冲区),以及有关原始数组数据的信息。数据缓冲区通常是人们认为是C或Fortran中的数组,这是一个包含固定大小数据项的连续(和固定)内存块。 Numpy还包含一组重要的数据,用于描述如何解释数据缓冲区中的数据。

因此,无论数组的大小如何,所有数据都存储在连续缓冲区中。现在考虑

a = np.array([1, 2, 3, 4])

b = np.array([[1, 2], [3, 4]])

访问a[1]确实需要(略微)少于b[1, 1]的操作(因为将1, 1转换为平面索引需要一些计算),但是,为了获得高性能,无论如何都需要vectorized operations

如果你想对数组中的所有元素求和,那么在这两种情况下你都会使用相同的东西:a.sum()b.sum(),并且总和将在连续内存中的元素之上。相反,如果数据本质上是2d,那么您可以执行b.sum(axis=1)之类的操作来对行进行求和。在一维数组中自己做这件事很容易出错,效率也不高。

所以,基本上是一个二维数组,如果问题很自然只是提供更多的功能,开销为零或可以忽略不计。