在矩阵中添加新行,每隔一行,其元素是其上方和下方元素的平均值

时间:2017-01-20 14:08:03

标签: python numpy matrix average

我有一个矩阵,说:

A = [1, 2, 3]
    [4, 5, 6]
    [7, 8, 9]

我想构建另一个矩阵,有两个额外的行

B = [1,    2,    3]
    [2.5, 3.5, 4.5]
    [4,     5,   6]
    [5.5, 6.5, 7.5]
    [7,     8,   9]

第二行和第四行的每个元素都是它上面和下面元素的平均值。

我想这样做,在python,numpy中,对于一个n x m矩阵。

编辑:对此的概括是每n行插入两个相邻行的均值。例如

     A = [ 1,  2,  3]
         [ 4,  5,  6]
         [ 7,  8,  9]
         [10, 11, 12]
         [13, 14, 15]
         [16, 17, 18]
         [19, 20, 21]

并且,对于n = 3,B将变为

     B = [ 1,  2,  3]
         [ 4,  5,  6]
         [ 7,  8,  9]
         [8.5, 9.5, 10.5]
         [10, 11, 12]
         [13, 14, 15]
         [16, 17, 18]
         [17.5, 18.5, 19.5]
         [19, 20, 21]

等等。 AVERAGE图层仍然是上面的平均值和它们下面的平均值。我正在寻找一个可以为任何n提供此功能的函数。

2 个答案:

答案 0 :(得分:4)

这是一种利用切片的方法 -

newvals = (A[1:] + A[:-1])/2.0
out = np.empty((A.shape[0]+newvals.shape[0],A.shape[1]))
out[::2] = A
out[1::2] = newvals

这是另一个np.insert的通用案例 -

np.insert(A.astype(float),range(1,A.shape[0]),newvals,axis=0)

概括以处理所有可能的n -

def insert_row_averages(A, n=1):
    slice2 = A[n::n]
    v = (A[n-1::n][:slice2.shape[0]] + slice2)/2.0
    return np.insert(A.astype(float),n*np.arange(1,v.shape[0]+1),v,axis=0)

样品运行 -

In [195]: A0
Out[195]: 
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

In [196]: insert_row_averages(A0, n=1)
Out[196]: 
array([[ 1. ,  2. ,  3. ],
       [ 2.5,  3.5,  4.5],
       [ 4. ,  5. ,  6. ],
       [ 5.5,  6.5,  7.5],
       [ 7. ,  8. ,  9. ]])

In [197]: A
Out[197]: 
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12],
       [13, 14, 15],
       [16, 17, 18],
       [19, 20, 21]])

In [198]: insert_row_averages(A, n=3)
Out[198]: 
array([[  1. ,   2. ,   3. ],
       [  4. ,   5. ,   6. ],
       [  7. ,   8. ,   9. ],
       [  8.5,   9.5,  10.5],
       [ 10. ,  11. ,  12. ],
       [ 13. ,  14. ,  15. ],
       [ 16. ,  17. ,  18. ],
       [ 17.5,  18.5,  19.5],
       [ 19. ,  20. ,  21. ]])

答案 1 :(得分:1)

一种选择是计算平均值,然后将其重新插入A

np.insert(A.astype(float), [1,2], (A[1:] + A[:-1])/2, axis=0)

#array([[ 1. ,  2. ,  3. ],
#       [ 2.5,  3.5,  4.5],
#       [ 4. ,  5. ,  6. ],
#       [ 5.5,  6.5,  7.5],
#       [ 7. ,  8. ,  9. ]])