我正在使用带有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()
保留矩阵大小并且不返回单个浮点数?
答案 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将对所有数组求和。
可能还有其他原因,但我猜不出来。