将 numpy 字符串转换为 numpy 字符 python

ank*_*kit 0 python numpy jupyter-notebook

我正在从 URL 读取数据并尝试将其转换为数字以在 jupyter 上进行进一步分析。它是一个基因序列,其中每个基因编码 4 个二进制数字。A --> 0001、C --> 0010、G --> 0100 和 T --> 1000。例如,我想从 CGGT 转到 0010010001001000。到目前为止,我已经能够删除空白并将其转换为字符串。但是我无法从字符串到字符以及字符到数字。我正在使用 numpy 数组,并进行了这些尝试,但没有成功。

charGenes = [var for var in genes if var]
Run Code Online (Sandbox Code Playgroud)

charGenes = np.char.array(genes)
Run Code Online (Sandbox Code Playgroud)

这是其余的代码:

import pandas as pd
import numpy as np

url = "https://archive.ics.uci.edu/ml/machine-learning-databases/molecular- biology/splice-junction-gene-sequences/splice.data"
file = pd.read_csv(url, delimiter=',', header=None,dtype='str')

X = file[2]
y = file[0]

myGenes = np.array(X)
stringGenes = myGenes.astype(str)

spaceGenes = stringGenes.reshape( stringGenes.size, 1)

genes = np.char.strip(spaceGenes)
genes
Run Code Online (Sandbox Code Playgroud)

这是输出:

array([['CCAGCTGCATCACAGGAGGCCAGCGAGCAGGTCTGTTCCAAGGGCCTTCGAGCCAGTCTG'],
   ['AGACCCGCCGGGAGGCGGAGGACCTGCAGGGTGAGCCCCACCGCCCCTCCGTGCCCCCGC'],
   ['GAGGTGAAGGACGTCCTTCCCCAGGAGCCGGTGAGAAGCGCAGTCGGGGGCACGGGGATG'],
   ...,
   ['TCTCGGGGGCGGCCGGCGCGGCGGGGAGCGGTCCCCGGCCGCGGCCCCGACGTGTGTGTC'],
   ['ATTCTACTTAGTAAACATAATTTCTTGTGCTAGATAACCAAATTAAGAAAACCAAAACAA'],
   ['AGGCTGCCTATCAGAAGGTGGTGGCTGGTGTGGCTGCTGCTCTGGCTCACAAGTACCATT']],
  dtype='<U79')
Run Code Online (Sandbox Code Playgroud)

任何指点帮助将不胜感激!

Pau*_*zer 6

这是使用查找表的方法:

>>> alphabet = np.array(list('ACGT'))
>>> alphabet
array(['A', 'C', 'G', 'T'], dtype='<U1')
Run Code Online (Sandbox Code Playgroud)

要使用查找表,我们需要将字母重新解释为索引,这是通过视图转换完成的:

>>> alph_as_num = alphabet.view(np.int32)
>>> alph_as_num
array([65, 67, 71, 84], dtype=int32)
Run Code Online (Sandbox Code Playgroud)

我们现在可以构建它需要的槽位的查找表85,其中我们实际上只使用 4 个槽位,即6567和。至于输出格式,我们可以自由选择最符合我们要求的格式:7184

示例一 - 输出为字节串:

>>> lookup_1 = np.zeros((alph_as_num.max()+1), dtype='S4')
>>> lookup_1[alph_as_num] = [b'0001000'[i:i+4] for i in range(4)]
Run Code Online (Sandbox Code Playgroud)

示例二 - 输出为uint8

>>> lookup_2 = np.zeros((alph_as_num.max()+1), dtype=np.uint8)
>>> lookup_2[alph_as_num] = 1 << np.arange(4)
Run Code Online (Sandbox Code Playgroud)

uint8示例三 -每个字母输出四个:

>>> lookup_3 = np.zeros((alph_as_num.max()+1, 4), dtype=np.uint8)
>>> lookup_3[alph_as_num[::-1]] = np.identity(4)
Run Code Online (Sandbox Code Playgroud)

现在让我们将其应用于100字母序列:

>>> seq
array(['CATTTCTCCACCATTTTGGTTTTTCATTGATCCGTTAGGTGGAGCCGGACTATGTCTACCGAAAGATGCACCTGCGCCGGGTCTGGTCTATCTCTTAATG'],
      dtype='<U100')
Run Code Online (Sandbox Code Playgroud)

翻译紧凑且快速,因为它仅依赖于

  • numpy 的内置高级索引为我们提供了非常快速的查找(例如比 Python 字典快得多)

  • 视图转换本质上是免费的,因为它所做的只是重新解释数据缓冲区(没有任何复制或转换)

示例一 - 字节串:

>>> lookup_1[seq.view(np.int32)]
array([b'0010', b'0001', b'1000', b'1000', b'1000', b'0010', b'1000',
       b'0010', b'0010', b'0001', b'0010', b'0010', b'0001', b'1000',
       b'1000', b'1000', b'1000', b'0100', b'0100', b'1000', b'1000',
       b'1000', b'1000', b'1000', b'0010', b'0001', b'1000', b'1000',
       b'0100', b'0001', b'1000', b'0010', b'0010', b'0100', b'1000',
       b'1000', b'0001', b'0100', b'0100', b'1000', b'0100', b'0100',
       b'0001', b'0100', b'0010', b'0010', b'0100', b'0100', b'0001',
       b'0010', b'1000', b'0001', b'1000', b'0100', b'1000', b'0010',
       b'1000', b'0001', b'0010', b'0010', b'0100', b'0001', b'0001',
       b'0001', b'0100', b'0001', b'1000', b'0100', b'0010', b'0001',
       b'0010', b'0010', b'1000', b'0100', b'0010', b'0100', b'0010',
       b'0010', b'0100', b'0100', b'0100', b'1000', b'0010', b'1000',
       b'0100', b'0100', b'1000', b'0010', b'1000', b'0001', b'1000',
       b'0010', b'1000', b'0010', b'1000', b'1000', b'0001', b'0001',
       b'1000', b'0100'], dtype='|S4')
Run Code Online (Sandbox Code Playgroud)

作为一种偏好,这些也可以被视为一个长序列:

>>> lookup_1[seq.view(np.int32)].view('S400')
array([b'0010000110001000100000101000001000100001001000100001100010001000100001000100100010001000100010000010000110001000010000011000001000100100100010000001010001001000010001000001010000100010010001000001001010000001100001001000001010000001001000100100000100010001010000011000010000100001001000101000010000100100001000100100010001001000001010000100010010000010100000011000001010000010100010000001000110000100'],
      dtype='|S400')
Run Code Online (Sandbox Code Playgroud)

示例二 - uint8

>>> lookup_2[seq.view(np.int32)]
array([2, 1, 8, 8, 8, 2, 8, 2, 2, 1, 2, 2, 1, 8, 8, 8, 8, 4, 4, 8, 8, 8,
       8, 8, 2, 1, 8, 8, 4, 1, 8, 2, 2, 4, 8, 8, 1, 4, 4, 8, 4, 4, 1, 4,
       2, 2, 4, 4, 1, 2, 8, 1, 8, 4, 8, 2, 8, 1, 2, 2, 4, 1, 1, 1, 4, 1,
       8, 4, 2, 1, 2, 2, 8, 4, 2, 4, 2, 2, 4, 4, 4, 8, 2, 8, 4, 4, 8, 2,
       8, 1, 8, 2, 8, 2, 8, 8, 1, 1, 8, 4], dtype=uint8)
Run Code Online (Sandbox Code Playgroud)

示例 3 -uint8每个字母四个;但让我们seq对多行使用不同的:

>>> seq
array([['CCCT'],
       ['GCGA']], dtype='<U4')
>>> lookup_3[seq.view(np.int32)].reshape(len(seq), -1)
array([[0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0],
       [0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1]], dtype=uint8)
Run Code Online (Sandbox Code Playgroud)