Python 每两列相加

Python 每两列相加,python,numpy,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 th

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

这里有一种使用np.split的方法:

或作为奇数长度数组的更一般的偶数方式:

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]])
以下是使用np.split的一种方法:

或作为奇数长度数组的更一般的偶数方式:

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

您可以简单地重塑形状,将最后一个尺寸拆分为两个尺寸,最后一个尺寸的长度为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.  ]])

您可以简单地重塑形状,将最后一个尺寸拆分为两个尺寸,最后一个尺寸的长度为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.  ]])
添加片c[:,::2]和c[:,1::2]:

添加片c[:,::2]和c[:,1::2]:


非常优雅,考虑周到!好主意。事实上,即使没有巫术,它也是有道理的。非常优雅,而且经过深思熟虑!好主意。事实上,即使没有巫术也有道理。非常好。非常非常次要的一点:为什么结尾是.T?从OP的问题来看,看起来维度应该是3x2,不是吗?@AmiTavory是的,我不太确定OP需要的o/p格式,但是因为OP提到了:0,0.5,0.5和0.75,0.25,0,我假设它们被设置成行。非常好。非常非常次要的一点:为什么结尾是.T?从OP的问题来看,维度应该是3x2,不是吗?@AmiTavory是的,我不太确定OP需要的o/p格式,但是因为OP提到了:0,0.5,0.5和0.75,0.25,0,我假设它们被设置成行。回答得好。小点:为了符合OP的尺寸,在末尾加上.T,不是吗?很好的答案。小点:为了配合OP的尺寸,在末尾加上.T,不是吗?