Python中的二維矩陣“相減”——答東小羊問

問題描述:

在一個 220*2 的矩陣 A 中,以行為單位(即每行),行與行之間不存在重復(fù)的數(shù)據(jù)×痘妫現(xiàn)已經(jīng)得到了矩陣 A 中的 i 行數(shù)據(jù)構(gòu)成的矩陣 B,求另外 220-i 行數(shù)據(jù)構(gòu)成的矩陣 C 杨何。

問題分析:
很明顯這個問題其實(shí)并不難,我們最容易想到的解決辦法就是for循環(huán)沥邻,一個不行就兩個危虱,兩個不行就三個……但如果要求你盡可能少的使用for循環(huán)時(shí),這個問題又該如何處理呢唐全?

本文實(shí)驗(yàn)環(huán)境:Python 3.6.1 |Anaconda 4.4.0 (64-bit)

方案1

拼接矩陣 + 虛數(shù)轉(zhuǎn)化 + 計(jì)數(shù)器

針對東小羊的這個具體的應(yīng)用場景埃跷,可以一個for循環(huán)也不使用。我們將B矩陣拼接在A矩陣的下方邮利,得到拼接矩陣A_B弥雹,由于只有兩列數(shù)據(jù),所以我們借助虛數(shù)的概念延届,將每一行數(shù)據(jù)轉(zhuǎn)化為一個整體剪勿,再使用計(jì)數(shù)器判斷矩陣A_B中每個元素的個數(shù),其中個數(shù)為1的即是我們要尋找的數(shù)據(jù)方庭。創(chuàng)建 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))  # 測試樣例
############# 關(guān)鍵代碼開始 #############
con_mat = np.concatenate((mat, sample_1), axis=0)  # 拼接矩陣
x = con_mat[:, 0] + con_mat[:, 1] * 1j  # 利用虛數(shù)
res = np.array(list(Counter(x).values()))
sample_2 = mat[res == 1, :]
############# 關(guān)鍵代碼結(jié)束 #############
print("總的矩陣為:\n", mat)
print("第一部分為:\n", sample_1)
print("第二部分為:\n", sample_2)

上述代碼的缺陷在于厕吉,僅僅只適用于矩陣為兩列的情況,如何讓代碼的魯棒性更強(qiáng)呢械念。

方案2

拼接矩陣 + 元組轉(zhuǎn)化 + 計(jì)數(shù)器

·方案1 中的虛數(shù)轉(zhuǎn)化其實(shí)就是將一行數(shù)據(jù)變?yōu)橐粋€單元头朱,那么同樣的我們可以將 get_others.py 中的虛數(shù)轉(zhuǎn)換部分改變?yōu)?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))  # 測試樣例
############# 關(guān)鍵代碼開始 #############
con_mat = np.concatenate((mat, sample_1), axis=0)  # 拼接矩陣
con_row_tuple = [tuple(t) for t in con_mat] # 將矩陣中的每一行轉(zhuǎn)換為tuple類型
res = np.array(list(Counter(con_row_tuple).values()))
sample_2 = mat[res == 1, :]
############# 關(guān)鍵代碼結(jié)束 #############
print("總的矩陣為:\n", mat)
print("第一部分為:\n", sample_1)
print("第二部分為:\n", sample_2)

方案3

元組轉(zhuǎn)化 + 集合運(yùn)算

在前面的基礎(chǔ)上龄减,只要你明白了每一行為一個元素项钮,那么引入集合來進(jìn)行減運(yùn)算也是非常容易理解的了。代碼如下:

import numpy as np

mat = np.arange(20).reshape((10, 2))
sample_1 = np.arange(0, 6).reshape((3, 2))  # 測試樣例
############# 關(guān)鍵代碼開始 #############
mat_tuple_set = set([tuple(t) for t in mat])  # 將矩陣中的每一行轉(zhuǎn)換為tuple類型并將結(jié)果轉(zhuǎn)為集合類型
sample_tuple_set = set([tuple(t) for t in sample_1])  # 將矩陣中的每一行轉(zhuǎn)換為tuple類型并將結(jié)果轉(zhuǎn)為集合類型
sample_2 = np.array([list(t) for t in (mat_tuple_set - sample_tuple_set)])  # 集合相減欺殿,再將結(jié)果轉(zhuǎn)換為二維矩陣形式
############# 關(guān)鍵代碼結(jié)束 #############
print("總的矩陣為:\n", mat)
print("第一部分為:\n", sample_1)
print("第二部分為:\n", sample_2)

利用集合來解決這個問題的思路是不錯的寄纵,但主要在數(shù)據(jù)類型的轉(zhuǎn)換上花了較多時(shí)間。

總結(jié)

通過本文的描述脖苏,二維矩陣按行(列)去重或計(jì)數(shù)有了一定的解決辦法程拭。去重和計(jì)數(shù)問題平常見得比較多的主要出現(xiàn)在一維的列表或數(shù)組中,通過借助 numpy.unique() 棍潘、collections.Counter() 或 轉(zhuǎn)換為 set 類型等等方法進(jìn)行解決恃鞋。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市亦歉,隨后出現(xiàn)的幾起案子恤浪,更是在濱河造成了極大的恐慌,老刑警劉巖肴楷,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件水由,死亡現(xiàn)場離奇詭異,居然都是意外死亡赛蔫,警方通過查閱死者的電腦和手機(jī)砂客,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門泥张,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鞠值,你說我怎么就攤上這事媚创。” “怎么了彤恶?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵钞钙,是天一觀的道長。 經(jīng)常有香客問我声离,道長芒炼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任抵恋,我火速辦了婚禮焕议,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘弧关。我一直安慰自己盅安,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布世囊。 她就那樣靜靜地躺著别瞭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪株憾。 梳的紋絲不亂的頭發(fā)上蝙寨,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機(jī)與錄音嗤瞎,去河邊找鬼墙歪。 笑死,一個胖子當(dāng)著我的面吹牛贝奇,可吹牛的內(nèi)容都是我干的虹菲。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼掉瞳,長吁一口氣:“原來是場噩夢啊……” “哼毕源!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起陕习,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤霎褐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后该镣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冻璃,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了俱饿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片歌粥。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖拍埠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情土居,我是刑警寧澤枣购,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站擦耀,受9級特大地震影響棉圈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜眷蜓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一分瘾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吁系,春花似錦德召、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蕴坪,卻和暖如春肴掷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背背传。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工呆瞻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人径玖。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓痴脾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親挺狰。 傳聞我的和親對象是個殘疾皇子明郭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,754評論 25 707
  • 《ilua》速成開發(fā)手冊3.0 官方用戶交流:iApp開發(fā)交流(1) 239547050iApp開發(fā)交流(2) 1...
    葉染柒丶閱讀 10,587評論 0 11
  • 手機(jī)的普及伴隨而來的是薯定,越來越多各式各樣的App產(chǎn)品。選用正確實(shí)用的APP瞳购,可以簡化生活话侄,提高工作的效率。今天推薦...
    小二翻身做掌柜閱讀 1,600評論 9 15
  • 今天的晨讀有意思。 老生常談的排列組合年堆,卻感覺多了許多新東西吞杭。 溫故而知新? 說說我看晨讀時(shí)候的心里路程变丧。 001...
    李爹閱讀 234評論 9 7
  • 我們很多人都在一個房子里芽狗,實(shí)際上我們是不自由被關(guān)起來的,但由于人很多房子也比較大痒蓬,并沒有人恐慌童擎。在一個桌子上堆了很...
    kirakira閱讀 201評論 0 1