如何解决是否有矢量化的方法来反转n x m numpy数组并将前端零移动到后端 说明
假设
A = np.array([1,2,0],[1,3,5,[5,6,7,9,10])
我正在尝试从A创建B:
B = np.array([2,1,[10,5])
换句话说,B是A反转了,前导零向后旋转。有矢量化的方法可以实现这一目标吗?
(创建B以便我可以vectorize the summation of the integer values in A with their reflection across the zero off diagonal)例如A [1] [0] + A [1] [4],A [1] [1] + A [1] [3] =(B + A)[0:2]
我唯一想到的就是尝试这样的事情。
首先我扭转了A
B = A.copy()
B = B[...,::-1]
哪个产量
B
Out[185]:
array([[ 0,1],[ 0,5]])
然后,我用以下内容遍历每一行。
for i in range(0,B.shape[0]):
a=np.trim_zeros(B[i])
B[i]=np.pad(a,(0,B.shape[1]-a.shape[0])
B
Out[]:
array([[ 2,[ 5,5]])
但是实际数据集的行和列可能要大几个数量级。有针对此问题的矢量化解决方案。
解决方法
这是一个带有蒙版的矢量化图片-
# nonzeros mask
nnz = A!=0
# Mask surrounded by nonzeros
max_accum = np.maximum.accumulate
island = max_accum(nnz,axis=1) & max_accum(nnz[:,::-1],axis=1)[:,::-1]
# Setup o/p array. Extract flipped A elements within each island per row and
# assign into sorted mask i.e. brought to front mask places in o/p
out = np.zeros_like(A)
out[np.sort(island,::-1]] = A[:,::-1][island[:,::-1]]
说明
输入数组(供ref和另一种用于处理大写情况并更好地解释):
In [147]: A
Out[147]:
array([[ 1,2,0],[ 0,4,6],[ 5,6,7,9,5,10]])
非零环绕的岛掩码:
向前累积掩码
In [148]: max_accum(nnz,axis=1)
Out[148]:
array([[ True,True,True],[False,False,[ True,True]])
使用nnz面罩翻转的后向累积面罩,进行前向累积,向后翻转
In [149]: max_accum(nnz[:,::-1]
Out[149]:
array([[ True,False],True]])
最终组合面膜带给我们孤岛
In [150]: max_accum(nnz,::-1]
Out[150]:
array([[ True,True]])
选择和分配:
In [159]: A
Out[159]:
array([[ 1,10]])
In [160]: island
Out[160]:
array([[ True,True]])
In [161]: A[:,::-1]
Out[161]:
array([[ 0,1],[ 6,[10,5]])
In [162]: island[:,::-1]
Out[162]:
array([[False,True]])
因此,请选择:
In [165]: A[:,::-1]]
Out[165]: array([ 2,1,10,5])
要选择前面的遮罩,请对岛遮罩进行排序,该遮罩选择要分配给以下位置的o / p位置:
In [163]: np.sort(island,::-1]
Out[163]:
array([[ True,True]])
然后,将那些选定的A分配给带有排序掩码的输出:
In [166]: out
Out[166]:
array([[ 2,5]])
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。