簡體   English   中英

過濾 numpy 字符數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM