使numpy.sum()返回矩阵之和而不是单个数字

时间:2015-05-04 13:53:15

标签: python arrays numpy matrix sum

我正在使用带有numpy的矩阵进行相当复杂的求和。 矩阵的形状为matrix.shape = (500, 500),阵列的形状为arr.shape = (25,)。操作如下:

totalsum = np.sum([i * matrix for i in arr])

以下是我不明白的事情:

np.sum()非常慢,只返回一个浮动float64。使用Python sum.()执行相同的操作,即

totalsum2 = sum([i*matrix for i in arr])

保留矩阵的形状。也就是说,得到的形状是totalsum2.shape() = (500, 500)。咦?

我还认为np.sum()花费的时间超过sum()是很奇怪的,特别是当我们使用numpy ndarrays时。

这到底发生了什么? 与np.sum()相比,sum()如何将上述值相加?

我希望np.sum()保留矩阵形状。如何设置维度np.sum()保留矩阵大小并且不返回单个浮点数?

3 个答案:

答案 0 :(得分:6)

你必须调用np.sum,并将可选的axis参数设置为0(轴0的总和,即你的列表理解所创建的那个)

totalsum = np.sum([i * matrix for i in arr], 0)

或者,您可以省略括号,以便np.sum评估生成器。

totalsum = np.sum(i * matrix for i in arr)

答案 1 :(得分:5)

Python的常规sum()任务正在获取该列表中的每个项目并将它们添加到一起。将相同大小的数组添加到一起时,只需按元素添加它们即可。例如:

test1 = np.array([[4,3],[2,1]])
test2 = np.array([[8,9],[1,1]])
print test1 + test2

返回

[[12,12]
[3,2]]

而对于np.sum,您沿轴或轴添加。如果你想维护数组中的东西,并且想要使用np.sum,你需要将你的操作(在数组中乘以i)投影到第三维,然后使用np.sum(axis = 2)

这可以使用:

完成
np.sum(matrix[:,:,np.newaxis] * array[np.newaxis,np.newaxis,:],axis=2) 

答案 2 :(得分:2)

[i*matrix for i in arr]  # list of matrices

上面的列表是一个矩阵列表,所以当你使用sum时,它会添加数组。

In [6]: matrix = np.array([[1,2],[3,4]])

In [7]: matrix
Out[7]: 
array([[1, 2],
       [3, 4]])


In [9]: [i * matrix for i in (2,4,8)]
Out[9]: 
[array([[2, 4],
        [6, 8]]), array([[ 4,  8],
        [12, 16]]), array([[ 8, 16],
        [24, 32]])]

请查看np.sum的帮助

    File:        /home/ale/.virtualenvs/ml/local/lib/python2.7/site-packages/numpy/core/fromnumeric.pyaxis=None, dtype=None, out=None, keepdims=False) Docstring: Sum of array elements over a given axis.

Parameters
---------- a : array_like
    Elements to sum. axis : None or int or tuple of ints, optional
    Axis or axes along which a sum is performed.
    The default (`axis` = `None`) is perform a sum over all
    the dimensions of the input array. `axis` may be negative, in
    which case it counts from the last to the first axis.

    .. versionadded:: 1.7.0

它表示如果你没有定义一个轴,它将对所有维度求和。例如:

In [4]: np.sum(np.array([[1,2],[3,4]]))  # 1 + 2 + 3 + 4...
Out[4]: 10

为什么np.sum需要更长的时间?直觉说,在表达式[i*matrix for i in arr]中,您为每个i创建一个新数组,然后np.sum将对所有数组求和。

可能还有其他原因,但我猜不出来。