[英]Filtering numpy character array
我有一個 numpy 字母和“-”數組 - 它可能有數萬行和數千列。 我想將所有的“-”向右移動(不改變其他字母的順序),然后截斷數組,以便沒有一列包含所有的“-”。 我正在尋找一個快速的解決方案,也許巧妙地使用內置的 numpy 例程。
背景:
數組中的每一行實際上是一個基因序列,其中“-”是隨機插入的,原因在這里並不重要。 我實際上可以將所有序列保存為字符串,而不是處理數組,用“-”填充它們以匹配最大非平凡序列長度,然后轉換為數組。 然而這結果相當緩慢,這就是為什么我正在尋找一種從字母數組開始的聰明方法,這很容易作為np.array(aln)
獲得,其中aln
是序列 biopython alignment object。
更新
這是一個例子,希望能澄清這個問題。 如果我從數組開始
np.array([['-', 'A', 'C', '-', 'T'], ['A', 'G', '-', 'T', 'T']])
我希望它被轉換為
np.array([['A', 'C', 'T', '-', '-'], ['A', 'G', 'T', 'T', '-']])
並最終
np.array([['A', 'C', 'T', '-'], ['A', 'G', 'T', 'T']])
看看這是否適合你
import numpy as np
data = np.array([['-', 'A', 'C', '-', 'T'], ['A', 'G', '-', 'T', 'T']])
new_data = np.tile('-', data.shape)
longest_line = 0
for i, line in enumerate(data):
not_dash = line != '-'
n_characters = sum(not_dash)
new_data[i, :n_characters] = line[not_dash]
longest_line = n_characters if n_characters > longest_line else longest_line
new_data = new_data[:, :longest_line]
輸出
>>> new_data
array([['A', 'C', 'T', '-'],
['A', 'G', 'T', 'T']], dtype='<U1')
這部分不清楚“我想過濾所有右側的'-'(不混合其他字母),然后截斷數組”
如果您只是嘗試刪除每個“-”,則可以使用掩碼,例如
import numpy as np
a = np.array([ 'w', '-' ,'-', 'x','-' ,'y', 'z' ])
b = a[~np.isin(a, '-')]
output 將是['w' 'x' 'y' 'z']
更新:
在您解釋之后,我建議先使用列表來表示您的數據,然后您可以對其進行過濾並將其轉換為 numpy 數組
import numpy as np
myList = [['-', 'A', 'C', '-', 'T'], ['A', 'G', '-', 'T', 'T']]
fil = [ [i for i in x if i != '-'] for x in myList]
length = max(map(len, fil))
myArr =np.array([xi+[None]*(length-len(xi)) for xi in fil])
Output:myArr
[['A' 'C' 'T' None]
['A' 'G' 'T' 'T']]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.