在numpy中使用ndim1或ndim2向量有什么性能原因吗?

2024-04-25 20:32:12 发布

您现在位置:Python中文网/ 问答频道 /正文

这似乎是一个相当基本的问题,但我没有找到任何相关的堆栈。抱歉,如果我错过了一个现有的问题。你知道吗

我已经看到了一些数学/线性代数的原因,为什么人们可能希望使用numpy向量“正确”(即ndim1),而不是行/列向量(即ndim2)。你知道吗

但现在我想知道:有没有什么(重要的)效率原因可以让一个选择另一个?还是在这方面的选择相当武断?你知道吗

(编辑)澄清:我所说的“ndim 1 vs ndim 2 vectors”是指将一个包含数字3和4的向量表示为:

  • 你知道吗np.数组([3,4])#ndim 1

  • 你知道吗np.数组([[3,4]])#ndim 2

numpy文档似乎倾向于将第一种情况作为默认情况,但正如我所说的,我想知道是否有性能上的差异。你知道吗


Tags: numpy编辑堆栈np情况原因数学数组
1条回答
网友
1楼 · 发布于 2024-04-25 20:32:12

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

如果你看numpy internals documentation,你可以看到

Numpy arrays consist of two major components, the raw array data (from now on, referred to as the data buffer), and the information about the raw array data. The data buffer is typically what people think of as arrays in C or Fortran, a contiguous (and fixed) block of memory containing fixed sized data items. Numpy also contains a significant set of data that describes how to interpret the data in the data buffer.

因此,不管数组的大小,所有数据都存储在一个连续的缓冲区中。现在考虑一下

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)之类的操作来对行求和。在1d阵列中自己这样做容易出错,而且效率不高。你知道吗

因此,基本上一个二维数组,如果它是自然的问题只是提供了更大的功能,零或可以忽略不计的开销。你知道吗

相关问题 更多 >