我有一个矩阵,说:
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提供此功能的函数。
答案 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. ]])