如何通過numpy子集來篩選矩陣或者陣列

2021-10-03 09:07:32 字數 2923 閱讀 8915

使用pandsa資料框時經常需要通過某一列來篩選資料,有時需要用for迴圈來篩選目標列,但for迴圈太慢,可以通過numpy子集函式先篩選索引,然後通過布林索引來篩選,可以極大提高篩選的速度,可以1秒篩選幾百萬的矩陣。

第二步,對於每個樣本,提取3條序列作為測試集合使用

比如要解決如下問題:

本人有個涉及質粒的矩陣,如下:

>>

> pdf6.head()0

1234

5678

9...

2072

2073

2074

2075

2076

2077

2078

2079 id6 plasmid032

1221

201164

41613.

..44

125113

18 ap012172_1 cp002635120

148141347

7128.

..81

9218

212 ap012172_2 ap012172216

1411247

4611105.

..35

105211

16 ap012173_3 ap012173329

1223

1614

1110624

8...

44102

211111 ap012174_4 ap012174437

1317249

122621

12...

86137

2927 ap012175_5 ap012175

每個質粒理論上應該有10個資料,但有些質粒不到10個,目標是去掉資料不夠10條的質粒樣本,然後每個取其中三個樣本。

#首先根據id sort,這樣同乙個質粒的sample會聚在一起

>>

> s_pdf6=pdf6.sort_values(

"id6"

)>>

> p6id = pdf6[

"plasmid"

]>>

> badplasid=pd.series(p6id)

.value_counts(

)[pd.series(p6id)

.value_counts()!=

10].index

>>

> badplasid

index(

['he577332'

,'cp014550'

,'cm002269'

,'ap018195'

,'he577331'

,'cp006583'

,'cm001479'

,'cp017127'

,'cp008949'

,'ef495211',.

..'he983996'

,'cp006924'

,'af312688'

,'af128883'

,'cp003436'

,'cm002137'

,'gu569091'

,'cp003435'

,'cp003442'

,'cp012459'],

dtype=

'object'

, length=

152)

# 計算子集

>>

> s_pdf6_bad_index=np.in1d(s_pdf6.plasmid,badplasid)

# 返回 s_pdf6_bad_index是乙個布林array,長度為s_pdf6.plasmid,元素中存在badplasid的地方為true,其他為bad

# 由於是需要去掉子集部分,因此需要用反轉(ture-false互相轉換)

>>

> s_pdf6_10_index=np.logical_not(s_pdf6_bad_index)

>>> pdf6_10s=s_pdf6[s_pdf6_10_index]
# 重設索引

>>> pdf6_10s=pdf6_10s.reset_index()

# 提取後7個sample為train data

>>> pdf_train=pdf6_10s[(pdf6_10s.index%10)>=3]

# 1. 檢視不夠10個sample的質粒

>>

> pd.series(p6id)

.value_counts(

)# 2. 觀察最後的行不夠10個位置,檢視一下index的位置,然後擷取前面夠10個的index。此處為後170個plasmid不夠10個sample

>>

> p_goodid=

list

(pd.series(p6id)

.value_counts(

).index)[:

-170

]# 對p_goodid中的元素依次迴圈提取並加到先前矩陣後面

>>

> pdf_test = pd.dataframe(columns = pdf6.columns)

>>

> pdf_train = pd.dataframe(columns = pdf6.columns)

>>

>

for i in p_goodid:

single=pdf6[pdf6.plasmid==i]:3

,],ignore_index=

true)3

:,],ignore_index=

true

)

第二種方法適合資料不多,如果資料量太大,花費時間太久。本人測試,第一種方法30s,第二種方法花了12h。

如何通過subId來獲取phoneId

androidl中使用一張資料表來儲存sim卡資訊 telephony.db中有一張記錄sim卡資訊的表,siminfo create table siminfo id integer primary key autoincrement,icc id text not null,sim id int...

如何通過左移測試來改善CI CD

在開發周期的早期進行自動化測試可以改善質量保證並減少延遲。試應用程式過去是一項技術挑戰性的,時間緊迫的活動,計畫在應用程式發布前幾天或幾周進行。開發團隊在第11個小時之前就有了編碼的餘地,而手動完成大部分工作的測試人員別無選擇,只能花些時間給他們。結果是許多應用程式經受了不合格的測試,技術團隊被迫應...

如何通過LeetCode來進行演算法題目練習

deliberate practicing 堅持 刻意練習 練習缺陷 弱點地 方 不 舒服 不 爽 枯燥 leetcode 題 目 分類 公司歸檔 做題 時間複雜度 editor atom visual code vim pycharm intellij feedback solutions fro...