我有一个矩阵,比如说:
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 提供此值。
最佳答案
这是一种利用切片的方法 -
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. ]])
关于python - 在矩阵中每隔一行添加一个新行,其元素是其上方和下方元素的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41765571/