Python 过滤numpy字符数组
我有一个字母和“-”的numpy数组,它可能有上万行和数千列。我想将所有的“-”移到右边(不改变其他字母的顺序),然后截断数组,这样就没有一列包含所有的“-”。我正在寻找一个快速的解决方案,也许可以巧妙地使用内置的numpy例程 背景:Python 过滤numpy字符数组,python,arrays,numpy,biopython,Python,Arrays,Numpy,Biopython,我有一个字母和“-”的numpy数组,它可能有上万行和数千列。我想将所有的“-”移到右边(不改变其他字母的顺序),然后截断数组,这样就没有一列包含所有的“-”。我正在寻找一个快速的解决方案,也许可以巧妙地使用内置的numpy例程 背景: 数组中的每一行实际上都是一个遗传序列,其中的“-”是随机插入的,原因在这里并不重要。不用处理数组,我实际上可以将所有序列保存为字符串,在右侧用“-”填充它们以匹配最大非平凡序列长度,然后转换为数组。然而,结果是相当缓慢的,这就是为什么我正在寻找一种聪明的方法来完
数组中的每一行实际上都是一个遗传序列,其中的“-”是随机插入的,原因在这里并不重要。不用处理数组,我实际上可以将所有序列保存为字符串,在右侧用“-”填充它们以匹配最大非平凡序列长度,然后转换为数组。然而,结果是相当缓慢的,这就是为什么我正在寻找一种聪明的方法来完成它,从一个字母数组开始,这是很容易获得的 作为
np.array(aln)
,其中aln
是序列生物粒子对齐对象
更新下面是一个例子,希望能澄清这个问题。如果我从数组开始
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
a = np.array([ 'w', '-' ,'-', 'x','-' ,'y', 'z' ])
b = a[~np.isin(a, '-')]
输出将是['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])
输出:myArr
[['A' 'C' 'T' None]
['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')
>>新数据
数组([[A',C',T','-'],
['A','G','T','T']],dtype='对我来说不清楚,你说的“我想过滤右边所有的'-'是什么意思'。你可以在你的问题后面加上一个示例数组和预期结果吗?我想把所有的“-”移到右边@LydiavanDyke@LydiavanDyke我添加了一个示例。它的方向可能是正确的。但是,我的数组是2D,不同行中的“-”数不相同。在当前形式中,它给了我一个flattened数组。我需要保留行,最好是每一行具有相同的长度。