是否有矢量化的方法来反转n x m numpy数组并将前端零移动到后端 说明

如何解决是否有矢量化的方法来反转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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?