Python numpy矩阵中连续列的平均值

Python numpy矩阵中连续列的平均值,python,numpy,matrix,Python,Numpy,Matrix,我希望返回一个矩阵,它是另一个矩阵的连续列的平均值,但是第一列是输入矩阵的1和第一列之间的平均值 我能够通过以下代码实现它,但我相信这不是处理此问题的最有效方法 import numpy as np a = np.matrix([[ 0.6,1.2,1.8,2.4,3],[0.8,1.6,2.4,3.2,4]]) matrix_resultado = numpy.zeros(shape=a.shape) #Same shape resulting matrix matrix_resulta

我希望返回一个矩阵,它是另一个矩阵的连续列的平均值,但是第一列是输入矩阵的1和第一列之间的平均值

我能够通过以下代码实现它,但我相信这不是处理此问题的最有效方法

import numpy as np

a = np.matrix([[ 0.6,1.2,1.8,2.4,3],[0.8,1.6,2.4,3.2,4]])

matrix_resultado = numpy.zeros(shape=a.shape) #Same shape resulting matrix

matrix_resultado[:,[0]] = ((1+a[:,0])/2) #First column average

#loop to calculate the average between the columns
for n in range(1,5):
    matrix_resultado[:,[n]] = ((a[:,(n-1)]+a[:,n])/2)

matrix_resultado
array([[ 0.8,  0.9,  1.5,  2.1,  2.7],
       [ 0.9,  1.2,  2. ,  2.8,  3.6]])
实现相同结果的最有效方法是什么?

方法1:这里有一种方法-

In [14]: col0_avg = (a[:,0,None] + 1)/2

In [15]: avg = (a[:,1:] + a[:,:-1])/2

In [16]: np.c_[col0_avg, avg]
Out[16]: 
matrix([[ 0.8,  0.9,  1.5,  2.1,  2.7],
        [ 0.9,  1.2,  2. ,  2.8,  3.6]])
方法#1-S:为了避免串联,我们可以从输入数组开始,然后执行适当的平均步骤,如下所示-

out = a.copy()
out[:,1:] += a[:,:-1]
out[:,0] += 1
out /= 2
方法#2:使用
统一过滤器可能更快-

In [35]: from scipy.ndimage.filters import uniform_filter1d as unif1d

In [150]: unif1d(a,size=2, axis=1, mode='constant', cval=1.0)
Out[150]: 
array([[ 0.8,  0.9,  1.5,  2.1,  2.7],
       [ 0.9,  1.2,  2. ,  2.8,  3.6]])

运行时测试-

In [133]: a = np.asmatrix(np.random.randn(200,10000))

In [134]: %%timeit
     ...: col0_avg = (a[:,0,None] + 1)/2
     ...: avg = (a[:,1:] + a[:,:-1])/2
     ...: out0 = np.c_[col0_avg, avg]
100 loops, best of 3: 7.3 ms per loop

In [135]: %%timeit
     ...: out = a.copy()
     ...: out[:,1:] += a[:,:-1]
     ...: out[:,0] += 1
     ...: out /= 2
100 loops, best of 3: 5.22 ms per loop

In [152]: %timeit unif1d(a,size=2, axis=1, mode='constant', cval=1.0)
100 loops, best of 3: 6.71 ms per loop
方法#1:这里有一种方法-

In [14]: col0_avg = (a[:,0,None] + 1)/2

In [15]: avg = (a[:,1:] + a[:,:-1])/2

In [16]: np.c_[col0_avg, avg]
Out[16]: 
matrix([[ 0.8,  0.9,  1.5,  2.1,  2.7],
        [ 0.9,  1.2,  2. ,  2.8,  3.6]])
方法#1-S:为了避免串联,我们可以从输入数组开始,然后执行适当的平均步骤,如下所示-

out = a.copy()
out[:,1:] += a[:,:-1]
out[:,0] += 1
out /= 2
方法#2:使用
统一过滤器可能更快-

In [35]: from scipy.ndimage.filters import uniform_filter1d as unif1d

In [150]: unif1d(a,size=2, axis=1, mode='constant', cval=1.0)
Out[150]: 
array([[ 0.8,  0.9,  1.5,  2.1,  2.7],
       [ 0.9,  1.2,  2. ,  2.8,  3.6]])

运行时测试-

In [133]: a = np.asmatrix(np.random.randn(200,10000))

In [134]: %%timeit
     ...: col0_avg = (a[:,0,None] + 1)/2
     ...: avg = (a[:,1:] + a[:,:-1])/2
     ...: out0 = np.c_[col0_avg, avg]
100 loops, best of 3: 7.3 ms per loop

In [135]: %%timeit
     ...: out = a.copy()
     ...: out[:,1:] += a[:,:-1]
     ...: out[:,0] += 1
     ...: out /= 2
100 loops, best of 3: 5.22 ms per loop

In [152]: %timeit unif1d(a,size=2, axis=1, mode='constant', cval=1.0)
100 loops, best of 3: 6.71 ms per loop