Python 如何实施“沿特定轴”操作?

Python 如何实施“沿特定轴”操作?,python,numpy,Python,Numpy,我可以使用numpy.sum对特定轴上的所有元素进行求和,即 >>> a = numpy.array([[1,2], [3,4]]) >>> numpy.sum(a, 1) array([3, 7]) 即沿行求和,逐行添加每列的元素 如果只有2或3个轴,我可以使用C/C++中的If…elif或swith…case实现它,但是如果有100个轴呢?如何实现它?Numpy数组只是罩下的一维C数组,因此沿着一个轴的步进是通过以步幅跳过C数组来实现的,步幅的大小取决于

我可以使用
numpy.sum
对特定轴上的所有元素进行求和,即

>>> a = numpy.array([[1,2], [3,4]])
>>> numpy.sum(a, 1)
array([3, 7])
即沿行求和,逐行添加每列的元素


如果只有2或3个轴,我可以使用C/C++中的
If…elif
swith…case
实现它,但是如果有100个轴呢?如何实现它?

Numpy数组只是罩下的一维C数组,因此沿着一个轴的步进是通过以步幅跳过C数组来实现的,步幅的大小取决于您迭代的维度(最快维度的最小步幅,在Python/C中是最后一个维度)

因此,您必须计算与轴相对应的步幅,然后在计算总和时逐步遍历数组。对于每个和,从数组中的偏移量开始(第一个偏移量为0),该偏移量随着步长的增加而增加


如果您想了解更多,可以阅读的第15章(无需阅读之前的所有内容),该章以C中的numpy数组迭代部分开始。

您想实现什么?numpy数组只是罩下的一维C数组,因此,沿着单个轴的步进是通过大步跳过C数组来实现的。因此,您必须计算对应于轴的步幅,然后在计算总和时逐步遍历数组。此外,在Python中,您可以使用
np.rollaxis
将第n轴移动到开头,并仅在第一个维度上实现它。@Evert您可以添加注释作为答案…正如@jorgeca已经提到的,
numpy.swapaxes通常就是这样做的。例如,看看联合国大学在这里的答案:此外,我发现
numpy
scipy
中的大多数核心方法实际上都是使用
C/C++
实现的,例如
convalve
correlate
,这是为什么?性能问题?如果使用纯python实现它们会怎么样?@Alcott:这就是numpy和scipy:performance的全部要点。只有当您使用PyPy这样的路由时,您可能会获得与本机C例程相同的速度,但通常只用于某些特定的操作(我没有尝试用PyPy在纯Python中实现各种更奇特的numpy/scipy例程,然后进行比较)。使用纯Python和普通的CPython通常会使您的速度降低100倍。@alcott:还有,代码重用。有很多代码都是针对速度而优化的,主要是用C或FORTRAN编写的。Numpy和scipy与其中一些库(或至少可以)接口,例如标准线性代数(BLAS、LAPACK)例程。他们没有试图重新发明轮子,而是提供了一个Pythonic接口,用于一些经过多年优化(和调试!)和验证的东西。