变换矩阵

编程入门 行业动态 更新时间:2024-10-27 04:26:36
本文介绍了变换矩阵的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我得到了以下小的numpy矩阵,该矩阵的值只能为0或1.我正在使用的实际矩阵的大小实际上要大得多,但出于演示目的,这是可以的.它的形状是(8, 11)

I got the following small numpy matrix, the values of the matrix can only be 0 or 1. The size of the actual matrix i am using is actually much bigger but for demonstration purposes this one is ok. The shape of it is (8, 11)

np_array = np.matrix( [[0,0,0,0,1,0,0,0,0,0,0], [0,0,0,1,0,1,0,0,0,0,0], [0,0,0,1,0,1,0,0,0,0,0], [0,0,1,0,0,1,1,0,0,0,0], [0,0,1,0,0,0,1,0,0,0,0], [0,1,0,0,0,0,1,1,0,1,1], [0,1,0,0,0,0,0,1,0,1,0], [1,0,0,0,0,0,0,1,1,1,0]] )

我需要以某种方式更改它,以便每一列应该只有一个值为1的行.因此,如果同一列有更多值为1的行,则值为的最高行保留1中的1,其余部分替换为0. 这是我追求的结果:

I need to change it in such a manner so that for each column there should be only a single row with the value of 1. So that if there is more rows with value of 1 for the same column the highest row with value of 1 is kept and the rest replaced with 0. Here is the result i am after:

np_array1 = np.matrix( [[0,0,0,0,1,0,0,0,0,0,0], [0,0,0,1,0,1,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0], [0,0,1,0,0,0,1,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0], [0,1,0,0,0,0,0,1,0,1,1], [0,0,0,0,0,0,0,0,0,0,0], [1,0,0,0,0,0,0,0,1,0,0]] )

基本上,每列可以具有单个值1,如果有多于一行,则保留最高的一行.我必须提到,也可能有列,其中所有行的值都不为1.这些列必须保持不变.矩阵的形状必须与转换之前的形状完全相同.

Basically each column can have a single value of 1, if there are more than one rows, then keep the highest one. I must mention that there can be also columns where none of the rows have value 1. Those columns must be left unchanged. The shape of the matrix must be exactly as it was before the transformation.

推荐答案

这是一种方法-

def per_col(a): idx = a.argmax(0) out = np.zeros_like(a) r = np.arange(a.shape[1]) out[idx, r] = a[idx, r] return out

示例运行

案例1:

In [41]: a Out[41]: array([[0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1], [0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0], [1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0]]) In [42]: per_col(a) Out[42]: array([[0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0]])

案例2(插入全零列):

Case #2 (Insert an all zeros column):

In [78]: a[:,1] = 0 In [79]: a Out[79]: array([[0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1], [0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0], [1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0]]) In [80]: per_col(a) Out[80]: array([[0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0]])

如果您对一线套或broadcasting的粉丝感到疯狂,这里是另一种-

If you are crazy about one-liners or a fan of broadcasting, here's another -

((a.argmax(0) == np.arange(a.shape[0])[:,None]).astype(int))*a.any(0)

样品运行-

In [89]: a Out[89]: array([[0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1], [0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0], [1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0]]) In [90]: ((a.argmax(0) == np.arange(a.shape[0])[:,None]).astype(int))*a.any(0) Out[90]: array([[0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0]])

运行时测试-

In [98]: a = np.random.randint(0,2,(100,10000)) # @DSM's soln In [99]: %timeit ((a == 1) & (a.cumsum(axis=0) == 1)).astype(int) 100 loops, best of 3: 5.19 ms per loop # Proposed in this post : soln1 In [100]: %timeit per_col(a) 100 loops, best of 3: 3.4 ms per loop # Proposed in this post : soln2 In [101]: %timeit ((a.argmax(0) == np.arange(a.shape[0])[:,None]).astype(int))*a.any(0) 100 loops, best of 3: 7.73 ms per loop

更多推荐

变换矩阵

本文发布于:2023-10-29 20:33:40,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1540676.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:矩阵

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!