Python 过滤numpy字符数组

Python 过滤numpy字符数组,python,arrays,numpy,biopython,Python,Arrays,Numpy,Biopython,我有一个字母和“-”的numpy数组,它可能有上万行和数千列。我想将所有的“-”移到右边(不改变其他字母的顺序),然后截断数组,这样就没有一列包含所有的“-”。我正在寻找一个快速的解决方案,也许可以巧妙地使用内置的numpy例程 背景: 数组中的每一行实际上都是一个遗传序列,其中的“-”是随机插入的,原因在这里并不重要。不用处理数组,我实际上可以将所有序列保存为字符串,在右侧用“-”填充它们以匹配最大非平凡序列长度,然后转换为数组。然而,结果是相当缓慢的,这就是为什么我正在寻找一种聪明的方法来完

我有一个字母和“-”的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数组。我需要保留行,最好是每一行具有相同的长度。