翻转非零值沿下三角numpy的阵列的每一行 [英] Flip non-zero values along each row of a lower triangular numpy array

查看:725
本文介绍了翻转非零值沿下三角numpy的阵列的每一行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个下三角阵,象乙:

I have a lower triangular array, like B:

B = np.array([[1,0,0,0],[.25,.75,0,0], [.1,.2,.7,0],[.2,.3,.4,.1]])

>>> B
array([[ 1.  ,  0.  ,  0.  ,  0.  ],
       [ 0.25,  0.75,  0.  ,  0.  ],
       [ 0.1 ,  0.2 ,  0.7 ,  0.  ],
       [ 0.2 ,  0.3 ,  0.4 ,  0.1 ]])

我想甩掉它看起来像:

I want to flip it to look like:

array([[ 1.  ,  0.  ,  0.  ,  0.  ],
       [ 0.75,  0.25,  0.  ,  0.  ],
       [ 0.7 ,  0.2 ,  0.1 ,  0.  ],
       [ 0.1 ,  0.4 ,  0.3 ,  0.2 ]])

这就是我要采取一切积极的价值观和积极的价值观发生逆转,使尾随零到位。这不是 fliplr 所做的:

That is, I want to take all the positive values, and reverse within the positive values, leaving the trailing zeros in place. This is not what fliplr does:

>>> np.fliplr(B)
array([[ 0.  ,  0.  ,  0.  ,  1.  ],
       [ 0.  ,  0.  ,  0.75,  0.25],
       [ 0.  ,  0.7 ,  0.2 ,  0.1 ],
       [ 0.1 ,  0.4 ,  0.3 ,  0.2 ]])

任何提示吗?此外,我与工作实际的数组会像 B.shape =(200,20,4,4)而不是(4, 4)。每个(4,4)块看起来像上面的例子(用不同的号码跨越200,20个不同的条目)。

Any tips? Also, the actual array I am working with would be something like B.shape = (200,20,4,4) instead of (4,4). Each (4,4) block looks like the above example (with different numbers across the 200, 20 different entries).

推荐答案

这个怎么样:

# row, column indices of the lower triangle of B
r, c = np.tril_indices_from(B)

# flip the column indices by subtracting them from r, which is equal to the number
# of nonzero elements in each row minus one
B[r, c] = B[r, r - c]

print(repr(B))
# array([[ 1.  ,  0.  ,  0.  ,  0.  ],
#        [ 0.75,  0.25,  0.  ,  0.  ],
#        [ 0.7 ,  0.2 ,  0.1 ,  0.  ],
#        [ 0.1 ,  0.4 ,  0.3 ,  0.2 ]])

同样的方法将推广到任意的 N 的维数组,它由多个下三角子矩阵:

The same approach will generalize to any arbitrary N-dimensional array that consists of multiple lower triangular submatrices:

# creates a (200, 20, 4, 4) array consisting of tiled copies of B
B2 = np.tile(B[None, None, ...], (200, 20, 1, 1))

print(repr(B2[100, 10]))
# array([[ 1.  ,  0.  ,  0.  ,  0.  ],
#        [ 0.25,  0.75,  0.  ,  0.  ],
#        [ 0.1 ,  0.2 ,  0.7 ,  0.  ],
#        [ 0.2 ,  0.3 ,  0.4 ,  0.1 ]])

r, c = np.tril_indices_from(B2[0, 0])
B2[:, :, r, c] = B2[:, :, r, r - c]

print(repr(B2[100, 10]))
# array([[ 1.  ,  0.  ,  0.  ,  0.  ],
#        [ 0.75,  0.25,  0.  ,  0.  ],
#        [ 0.7 ,  0.2 ,  0.1 ,  0.  ],
#        [ 0.1 ,  0.4 ,  0.3 ,  0.2 ]])

有关,你可以简单地减去上三角矩阵研究 C 来代替,例如:

For an upper triangular matrix you could simply subtract r from c instead, e.g.:

r, c = np.triu_indices_from(B.T)
B.T[r, c] = B.T[c - r, c]

这篇关于翻转非零值沿下三角numpy的阵列的每一行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆