如何计算二维numpy数组所有列的总和(高效)
- 2025-03-07 09:02:00
- admin 原创
- 30
问题描述:
假设我有以下由四行和三列组成的二维 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]
)? 无需循环遍历所有列就可以做到这一点吗?
解决方案 1:
查看 的文档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.mean
,numpy.cumsum
和numpy.std
,也接受axis
参数。
来自暂定的Numpy教程:
许多一元运算(例如计算数组中所有元素的总和)都是作为
ndarray
类的方法实现的。默认情况下,这些操作应用于数组,就像它是数字列表一样,无论其形状如何。但是,通过指定axis
参数,您可以沿数组的指定轴应用操作:
解决方案 2:
对列求和的其他方法包括
numpy.einsum('ij->j', a)
和
numpy.dot(a.T, numpy.ones(a.shape[0]))
如果行数和列数处于相同的数量级,则所有可能性的速度大致相同:
然而,如果只有几列,einsum
和dot
解决方案都明显优于 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)',
)
解决方案 3:
使用以下axis
论点:
>> numpy.sum(a, axis=0)
array([18, 22, 26])
解决方案 4:
numpy.sum
对于你的情况,使用.
sum = a.sum(axis=0)
解决方案 5:
然后 NumPysum
函数采用一个可选的轴参数,该参数指定您希望沿哪个轴执行求和:
>>> a = numpy.arange(12).reshape(4,3)
>>> a.sum(0)
array([18, 22, 26])
或者,等效地:
>>> numpy.sum(a, 0)
array([18, 22, 26])
解决方案 6:
a.sum(0)
应该可以解决问题。它是二维的np.array
,您将得到所有列的总和。axis=0
是指向下方的维度和axis=1
指向右侧的维度。
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD