我想计算矩阵中两列中的两个之和(列0和1之间的总和,介于2和3之间......)。
所以我试着做嵌套" for"循环,但每次我都没有好结果。
例如:
c = np.array([[0,0,0.25,0.5],[0,0.5,0.25,0],[0.5,0,0,0]],float)
freq=np.zeros(6,float).reshape((3, 2))
#I calculate the sum between the first and second column, and between the fird and the fourth column
for i in range(0,4,2):
for j in range(1,4,2):
for p in range(0,2):
freq[:,p]=(c[:,i]+c[:,j])
但结果是:
print freq
array([[ 0.75, 0.75],
[ 0.25, 0.25],
[ 0. , 0. ]])
通常,良好的结果必须是(0。,0.5,0.5)和(0.75,0.25,0)。所以我认为问题出在嵌套" for"环路。
是否有人知道如何计算每两列的总和,因为我有一个包含400列的矩阵?
答案 0 :(得分:3)
您可以简单地重塑以将最后一个维度拆分为两个维度,最后一个维度为2
,然后沿着它加总,就像这样 -
freq = c.reshape(c.shape[0],-1,2).sum(2).T
重塑只会创建一个数组视图,所以我们只是在这里使用求和操作,因此必须高效。
示例运行 -
In [17]: c
Out[17]:
array([[ 0. , 0. , 0.25, 0.5 ],
[ 0. , 0.5 , 0.25, 0. ],
[ 0.5 , 0. , 0. , 0. ]])
In [18]: c.reshape(c.shape[0],-1,2).sum(2).T
Out[18]:
array([[ 0. , 0.5 , 0.5 ],
[ 0.75, 0.25, 0. ]])
答案 1 :(得分:3)
添加切片c[:, ::2]
和c[:, 1::2]
:
In [62]: c
Out[62]:
array([[ 0. , 0. , 0.25, 0.5 ],
[ 0. , 0.5 , 0.25, 0. ],
[ 0.5 , 0. , 0. , 0. ]])
In [63]: c[:, ::2] + c[:, 1::2]
Out[63]:
array([[ 0. , 0.75],
[ 0.5 , 0.25],
[ 0.5 , 0. ]])
答案 2 :(得分:2)
以下是使用np.split()
的一种方式:
In [36]: np.array(np.split(c, np.arange(2, c.shape[1], 2), axis=1)).sum(axis=-1)
Out[36]:
array([[ 0. , 0.5 , 0.5 ],
[ 0.75, 0.25, 0. ]])
或者甚至对于奇数长度数组也是一种更通用的方式:
In [87]: def vertical_adder(array):
return np.column_stack([np.sum(arr, axis=1) for arr in np.array_split(array, np.arange(2, array.shape[1], 2), axis=1)])
....:
In [88]: vertical_adder(c)
Out[88]:
array([[ 0. , 0.75],
[ 0.5 , 0.25],
[ 0.5 , 0. ]])
In [94]: a
Out[94]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
In [95]: vertical_adder(a)
Out[95]:
array([[ 1, 5, 4],
[11, 15, 9],
[21, 25, 14]])