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)
任何指点帮助将不胜感激!
这是使用查找表的方法:
>>> 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 个槽位,即65、67和。至于输出格式,我们可以自由选择最符合我们要求的格式: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)
| 归档时间: |
|
| 查看次数: |
3418 次 |
| 最近记录: |