美文网首页机器学习码农的世界程序员
Python中的二维矩阵“相减”——答东小羊问

Python中的二维矩阵“相减”——答东小羊问

作者: 高正杰 | 来源:发表于2017-12-27 22:59 被阅读26次

问题描述:

在一个 220*2 的矩阵 A 中,以行为单位(即每行),行与行之间不存在重复的数据。现已经得到了矩阵 A 中的 i 行数据构成的矩阵 B,求另外 220-i 行数据构成的矩阵 C 。

问题分析:
很明显这个问题其实并不难,我们最容易想到的解决办法就是for循环,一个不行就两个,两个不行就三个……但如果要求你尽可能少的使用for循环时,这个问题又该如何处理呢?

本文实验环境:Python 3.6.1 |Anaconda 4.4.0 (64-bit)

方案1

拼接矩阵 + 虚数转化 + 计数器

针对东小羊的这个具体的应用场景,可以一个for循环也不使用。我们将B矩阵拼接在A矩阵的下方,得到拼接矩阵A_B,由于只有两列数据,所以我们借助虚数的概念,将每一行数据转化为一个整体,再使用计数器判断矩阵A_B中每个元素的个数,其中个数为1的即是我们要寻找的数据。创建 get_others.py 代码如下:

import numpy as np
from collections import Counter

mat = np.arange(20).reshape((10, 2))
sample_1 = np.arange(0, 6).reshape((3, 2))  # 测试样例
############# 关键代码开始 #############
con_mat = np.concatenate((mat, sample_1), axis=0)  # 拼接矩阵
x = con_mat[:, 0] + con_mat[:, 1] * 1j  # 利用虚数
res = np.array(list(Counter(x).values()))
sample_2 = mat[res == 1, :]
############# 关键代码结束 #############
print("总的矩阵为:\n", mat)
print("第一部分为:\n", sample_1)
print("第二部分为:\n", sample_2)

上述代码的缺陷在于,仅仅只适用于矩阵为两列的情况,如何让代码的鲁棒性更强呢。

方案2

拼接矩阵 + 元组转化 + 计数器

·方案1 中的虚数转化其实就是将一行数据变为一个单元,那么同样的我们可以将 get_others.py 中的虚数转换部分改变为 tuple 即可,修改后的代码如下:

import numpy as np
from collections import Counter

mat = np.arange(20).reshape((10, 2))
sample_1 = np.arange(0, 6).reshape((3, 2))  # 测试样例
############# 关键代码开始 #############
con_mat = np.concatenate((mat, sample_1), axis=0)  # 拼接矩阵
con_row_tuple = [tuple(t) for t in con_mat] # 将矩阵中的每一行转换为tuple类型
res = np.array(list(Counter(con_row_tuple).values()))
sample_2 = mat[res == 1, :]
############# 关键代码结束 #############
print("总的矩阵为:\n", mat)
print("第一部分为:\n", sample_1)
print("第二部分为:\n", sample_2)

方案3

元组转化 + 集合运算

在前面的基础上,只要你明白了每一行为一个元素,那么引入集合来进行减运算也是非常容易理解的了。代码如下:

import numpy as np

mat = np.arange(20).reshape((10, 2))
sample_1 = np.arange(0, 6).reshape((3, 2))  # 测试样例
############# 关键代码开始 #############
mat_tuple_set = set([tuple(t) for t in mat])  # 将矩阵中的每一行转换为tuple类型并将结果转为集合类型
sample_tuple_set = set([tuple(t) for t in sample_1])  # 将矩阵中的每一行转换为tuple类型并将结果转为集合类型
sample_2 = np.array([list(t) for t in (mat_tuple_set - sample_tuple_set)])  # 集合相减,再将结果转换为二维矩阵形式
############# 关键代码结束 #############
print("总的矩阵为:\n", mat)
print("第一部分为:\n", sample_1)
print("第二部分为:\n", sample_2)

利用集合来解决这个问题的思路是不错的,但主要在数据类型的转换上花了较多时间。

总结

通过本文的描述,二维矩阵按行(列)去重或计数有了一定的解决办法。去重和计数问题平常见得比较多的主要出现在一维的列表或数组中,通过借助 numpy.unique()collections.Counter() 或 转换为 set 类型等等方法进行解决。

相关文章

  • Python中的二维矩阵“相减”——答东小羊问

    问题描述: 在一个 220*2 的矩阵 A 中,以行为单位(即每行),行与行之间不存在重复的数据。现已经得到了矩阵...

  • python之数组

    python中,一维数组被打印成行,二维数组成矩阵,三维数组成矩阵列表。 一维是行,横着延伸;(里层for) 二维...

  • numpy快速入门(3):算术运算

    1. 减法 相同维度的两个矩阵相减,相当于对应位置上的元素相减 2. 对应位置相乘 3. 矩阵乘法 只有当矩阵A的...

  • np.array的shape |tf.nn.conv2d | t

    python中的矩阵、多维数组----numpy 上面这个(3, 4, 2)三维数组就可以看作3个4*2的二维矩阵...

  • python的矩阵运算

    python自身不支持矩阵运算,一般想要在python进行矩阵运算:一个方法是自己用二维列表定义矩阵,然后自己写矩...

  • 东问西答

    1、让每一堵墙都会说话:那肯定指的是一所教师都特别笨的学校。 2、一个好校长等于一所好学校:连门卫都不同意的观点。...

  • numPy综合使用

    .I 操作符实现了矩阵求逆的运算,eye(4)产生4×4的单位矩阵,相减可以得到误差。

  • 矩阵的二维变换(转)

    二维平移、二维旋转 二维缩放、通用二维基准点旋转矩阵 通用二维基准点缩放矩阵、通用二维定向缩放矩阵、通用二维复合变...

  • 二维变换

    二维平移、二维旋转 二维缩放、通用二维基准点旋转矩阵 通用二维基准点缩放矩阵、通用二维定向缩放矩阵、通用二维复合变...

  • 说说Python中的help()和dir()函数?

    问:说说Python中的help()和dir()函数?答:在Python中help()和dir()这两个函数都可以...

网友评论

  • 冬小羊:太厉害了。大有收获。期待更多的博客。
    高正杰:@冬小羊 谢谢!互相学习,共同进步!😀😀

本文标题:Python中的二维矩阵“相减”——答东小羊问

本文链接:https://www.haomeiwen.com/subject/cmhsgxtx.html