每两列添加一次

时间:2016-09-25 10:54:13

标签: python numpy

我想计算矩阵中两列中的两个之和(列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列的矩阵?

3 个答案:

答案 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]])