繁体   English   中英

如何计算二维 numpy 数组的所有列的总和(有效)

[英]How to calculate the sum of all columns of a 2D numpy array (efficiently)

假设我有以下由四行三列组成的二维 numpy 数组:

>>> a = numpy.arange(12).reshape(4,3)
>>> print(a)
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]

生成包含所有列之和的一维数组(如[18, 22, 26] )的有效方法是什么? 这可以在不需要遍历所有列的情况下完成吗?

查看numpy.sum的文档,特别注意axis参数。 对列求和:

>>> import numpy as np
>>> a = np.arange(12).reshape(4,3)
>>> a.sum(axis=0)
array([18, 22, 26])

或者,对行求和:

>>> a.sum(axis=1)
array([ 3, 12, 21, 30])

其他聚合函数,如numpy.meannumpy.cumsumnumpy.std ,例如,也采用axis参数。

来自暂定的 Numpy 教程

许多一元运算,例如计算数组中所有元素的总和,都是作为ndarray类的方法实现的。 默认情况下,这些操作适用于数组,就好像它是一个数字列表,无论其形状如何。 但是,通过指定axis参数,您可以沿数组的指定轴应用操作:

对列求和的其他替代方法是

numpy.einsum('ij->j', a)

numpy.dot(a.T, numpy.ones(a.shape[0]))

如果行数和列数处于相同数量级,则所有可能性的速度大致相同:

在此处输入图片说明

但是,如果只有几列,则einsumdot解决方案都明显优于 numpy 的sum (注意对数刻度):

在此处输入图片说明


重现图的代码:

import numpy
import perfplot


def numpy_sum(a):
    return numpy.sum(a, axis=1)


def einsum(a):
    return numpy.einsum('ij->i', a)


def dot_ones(a):
    return numpy.dot(a, numpy.ones(a.shape[1]))


perfplot.save(
    "out1.png",
    # setup=lambda n: numpy.random.rand(n, n),
    setup=lambda n: numpy.random.rand(n, 3),
    n_range=[2**k for k in range(15)],
    kernels=[numpy_sum, einsum, dot_ones],
    logx=True,
    logy=True,
    xlabel='len(a)',
    )

使用numpy.sum 对于你的情况,它是

sum = a.sum(axis=0)

使用axis参数:

>> numpy.sum(a, axis=0)
  array([18, 22, 26])

然后 NumPy sum函数采用一个可选的轴参数,指定您希望沿着哪个轴执行求和:

>>> a = numpy.arange(12).reshape(4,3)
>>> a.sum(0)
array([18, 22, 26])

或者,等效地:

>>> numpy.sum(a, 0)
array([18, 22, 26])
a.sum(0)

应该可以解决问题。 它是一个二维np.array ,您将获得所有列的总和。 axis=0是向下的维度, axis=1是指向右边的维度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM