2017-12-28 21 views
0

このコードの目的は、辞書のリストを取得し、特定の辞書を取得し、この辞書の値を使用してリストを作成することですリストを数値的な配列に変換し、これまでのコードの前のセクションで構築した3399の辞書(len(X))すべてに対してこれを実行します。私は最後の部分ValueError:入力配列をシェイプから(83)シェイプにブロードキャストできませんでした(84)

input_array = np.zeros([len(X),84]) 
for i in range(0,len(X)): 
input_array[i,:] = np.array(list(inputs_dict[i].values())) 

次の行のコードを実行することになったまで、このプロセスの各ステップは、スムーズに行ってきました、次のエラーが現れます:

ValueError: could not broadcast input array from shape (83) into shape (84) 

まあ、解決策はかなり明白だが、右?初期化された配列の寸法を変更するだけで、すべてが固定されます。次のように次元を変更すると、私がやりたいことや試しても、バイパスできないような非常に奇妙な結果が得られます。初期化された配列の次元を変更する

input_array = np.zeros([len(X),83]) 
for i in range(0,len(X)): 
input_array[i,:] = np.array(list(inputs_dict[i].values())) 
ValueError: could not broadcast input array from shape (84) into shape (83) 

は何とか大きな2Dアレイ構造に置かれる必要がある私のすでに既製の配列の次元を変更します。

私は本当に...、整形追加、連結、スタッキングなど、私は見つけることができるすべての可能な機能を使用して、この問題を回避する

を試してみました。この問題に対する解決策があるだろうかどうかは/巨大な助けになります辞書のリストから値を取り出し、それらを数が少ない配列にするより簡単な方法です。

フルコード:

X = pd.read_csv('PromoterTrain.csv', index_col=0).values.tolist() 
y = pd.read_csv('SigmaTrain.csv', index_col=0).values.tolist() 

def reverse_complement(dna): 
     complement = {'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A'} 
     return ''.join([complement[base] for base in dna[::-1]]) 

X = [''.join(x) for x in X]  
X_comp = [reverse_complement(X[i]) for i in range(0,len(X))] 
kmer_1 = ['A','T','G','C'] 
kmer_2 = ['AA', 'AT', 'AG', 'AC', 'TA', 'TT', 'TG', 'TC', 'GA', 'GT', 'GG', 
'GC', 'CA', 'CT', 'CG', 'CC'] 
kmer_3 = ['AAA', 'AAT', 'AAG', 'AAC', 'ATA', 'ATT', 'ATG', 'ATC', 'AGA', 
'AGT', 'AGG', 'AGC', 'ACA', 'ACT', 'ACG', 'ACC', 'TAA', 'TAT', 'TAG', 'TAC', 
'TTA', 'TTT', 'TTG', 'TTC', 'TGA', 'TGT', 'TGG', 'TGC', 'TCA', 'TCT', 'TCG', 
'TCC', 'GAA', 'GAT', 'GAG', 'GAC', 'GTA', 'GTT', 'GTG', 'GTC', 'GGA', 'GGT', 
'GGG', 'GGC', 'GCA', 'GCT', 'GCG', 'GCC', 'CAA', 'CAT', 'CAG', 'CAC', 'CTA', 
'CTT', 'CTG', 'CTC', 'CGA', 'CGT', 'CGG', 'CGC', 'CCA', 'CCT', 'CCG', 'CCC'] 

inputs_default = {'A':0,'T':0,'G':0,'C':0} 
for i in range(0,len(kmer_2)-1): 
     inputs_default[kmer_2[i]] = 0 
for i in range(0,len(kmer_3)-1): 
     inputs_default[kmer_3[i]] = 0 

def count_kmers(seq, K): 
     return Counter(seq[start:start+K] for start in range(len(seq) - K)) 

inputs_dict = [] 
combined_1mers = {} 
combined_2mers = {} 
combined_3mers = {} 
combined_1mers_revcomp = {} 
combined_2mers_revcomp = {} 
combined_3mers_revcomp = {} 

for i in range(0,len(X)-1): 
    combined_1mers = count_kmers(X[i],1) 
    combined_2mers = count_kmers(X[i],2) 
    combined_3mers = count_kmers(X[i],3) 
    combined_1mers_revcomp = count_kmers(X_comp[i],1) 
    combined_2mers_revcomp = count_kmers(X_comp[i],2) 
    combined_3mers_revcomp = count_kmers(X_comp[i],3)  
    combined_kmers_forward = 
{**combined_1mers,**combined_2mers,**combined_3mers} 
    combined_kmers_revcomp = 
{**combined_1mers_revcomp,**combined_2mers_revcomp,**combined_3mers_revcomp} 
    combined_kmers = dict((n, combined_kmers_forward.get(n, 
0)+combined_kmers_revcomp.get(n, 0)) for n in 
set(combined_kmers_forward)|set(combined_kmers_revcomp)) 
    inputs_dict.append(dict((n, inputs_default.get 

input_array = np.zeros([len(X),84]) 
for i in range(0,len(X)): 
    input_array[i,:] = np.array(list(inputs_dict[i].values())) 

inputs_dictための出力NN NP インポートパンダとして インポートnumpyのコレクションからPD トーチインポートautogradからカウンタ インポートトーチ をインポートするように、[0:2]が得られます。

[{'A': 28, 
    'AA': 10, 
    'AAA': 3, 
    'AAC': 3, 
    'AAG': 3, 
    'AAT': 1, 
    'AC': 6, 
    'ACA': 2, 
    'ACC': 0, 
    'ACG': 2, 
    'ACT': 2, 
    'AG': 4, 
    'AGA': 1, 
    'AGC': 0, 
    'AGG': 1, 
    'AGT': 2, 
    'AT': 8, 
    'ATA': 0, 
    'ATC': 4, 
    'ATG': 3, 
    'ATT': 1, 
    'C': 22, 
    'CA': 9, 
    'CAA': 3, 
    'CAC': 2, 
    'CAG': 1, 
    'CAT': 3, 
    'CC': 2, 
    'CCA': 1, 
    'CCG': 0, 
    'CCT': 1, 
    'CG': 6, 
    'CGA': 1, 
    'CGC': 3, 
    'CGG': 0, 
    'CGT': 2, 
    'CT': 4, 
    'CTA': 0, 
    'CTC': 0, 
    'CTG': 1, 
    'CTT': 3, 
    'G': 21, 
    'GA': 7, 
    'GAA': 3, 
    'GAC': 0, 
    'GAG': 0, 
    'GAT': 4, 
    'GC': 6, 
    'GCA': 1, 
    'GCC': 1, 
    'GCG': 3, 
    'GCT': 0, 
    'GG': 2, 
    'GGA': 1, 
    'GGC': 1, 
    'GGG': 0, 
    'GGT': 0, 
    'GT': 6, 
    'GTA': 1, 
    'GTC': 0, 
    'GTG': 2, 
    'GTT': 3, 
    'T': 29, 
    'TA': 2, 
    'TAA': 1, 
    'TAC': 1, 
    'TAG': 0, 
    'TAT': 0, 
    'TC': 7, 
    'TCA': 4, 
    'TCC': 1, 
    'TCG': 1, 
    'TCT': 1, 
    'TG': 9, 
    'TGA': 4, 
    'TGC': 2, 
    'TGG': 1, 
    'TGT': 2, 
    'TT': 10, 
    'TTA': 1, 
    'TTC': 3, 
    'TTG': 2, 
    'TTT': 3}, 
{'A': 26, 
    'AA': 8, 
    'AAA': 3, 
    'AAC': 1, 
    'AAG': 1, 
    'AAT': 3, 
    'AC': 4, 
    'ACA': 2, 
    'ACC': 1, 
    'ACG': 0, 
    'ACT': 1, 
    'AG': 6, 
    'AGA': 3, 
    'AGC': 2, 
    'AGG': 0, 
    'AGT': 1, 
    'AT': 8, 
    'ATA': 1, 
    'ATC': 2, 
    'ATG': 2, 
    'ATT': 3, 
    'C': 24, 
    'CA': 7, 
    'CAA': 1, 
    'CAC': 2, 
    'CAG': 2, 
    'CAT': 2, 
    'CC': 4, 
    'CCA': 1, 
    'CCG': 2, 
    'CCT': 0, 
    'CG': 6, 
    'CGA': 1, 
    'CGC': 3, 
    'CGG': 1, 
    'CGT': 0, 
    'CT': 6, 
    'CTA': 0, 
    'CTC': 3, 
    'CTG': 2, 
    'CTT': 1, 
    'G': 23, 
    'GA': 7, 
    'GAA': 2, 
    'GAC': 0, 
    'GAG': 3, 
    'GAT': 2, 
    'GC': 8, 
    'GCA': 2, 
    'GCC': 1, 
    'GCG': 3, 
    'GCT': 2, 
    'GG': 3, 
    'GGA': 1, 
    'GGC': 1, 
    'GGG': 0, 
    'GGT': 1, 
    'GT': 4, 
    'GTA': 1, 
    'GTC': 0, 
    'GTG': 2, 
    'GTT': 1, 
    'T': 27, 
    'TA': 4, 
    'TAA': 2, 
    'TAC': 1, 
    'TAG': 0, 
    'TAT': 1, 
    'TC': 7, 
    'TCA': 2, 
    'TCC': 1, 
    'TCG': 1, 
    'TCT': 3, 
    'TG': 8, 
    'TGA': 2, 
    'TGC': 2, 
    'TGG': 2, 
    'TGT': 2, 
    'TT': 8, 
    'TTA': 2, 
    'TTC': 2, 
    'TTG': 1, 
    'TTT': 3}] 
+1

'inputs_dict'には何がありますか?あなたはそのオブジェクトのサンプルを与えることができますか? – alvas

+0

[mcve] please ... – Julien

+0

私の推測では、1つのdicts要素には84語があり、もう1つは83語です。ソースを理解していることを確認してください。 – hpaulj

答えて

1

TL; DR

inputs_dictオブジェクトの内容を確認してください。

もし np.zeros([x, y])を使用する場合、それはゼロ値で満たされたx行及びy列の行列を返すロングで

>>> import numpy as np 
>>> np.zeros([3,10]) 
array([[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]]) 
>>> np.zeros([3,10]).shape 
(3, 10) 

もしrange(x, y)を使用する場合、それはリストの開始を戻しますxとy-1で終わる:

>>> list(range(0, 3)) 
[0, 1, 2] 

そして、まず

numpy_array[i,:] = [0,1,2,3,4,5,6,7,8,9] 

>>> inputs = np.zeros([3,10]) 

>>> inputs[0,:] 
array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]) 
>>> inputs[1,:] 
array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]) 
>>> inputs[2,:] 
array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]) 

>>> inputs 
array([[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]]) 

行上書き:左右限り

>>> inputs = np.zeros([3,10]) 

>>> inputs[0,:] = [0,1,2,3,4,5,6,7,8,9] 

>>> inputs[0,:] 
array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]) 

>>> inputs 
array([[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.], 
     [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]]) 

をSはフロートのリストをnumpyのアレイの行を上書きしますinputs[i,:] = [0,1,2,3,4,5,6,7,8,9]のサイズが同じであれば、正常に上書きする必要があります。それ以外の場合は、あなたの質問に同じエラーがあります。

>>> inputs[1,:] = [0,1,2,3] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: cannot copy sequence with size 4 to array axis with dimension 10 

あなたがinput_array[i,:] = np.array(list(inputs_dict[i].values()))の右側のサイズを確認し、それが同じ形状だかどうかを確認する必要が間違っているかを知るために、あなたのコードに戻って。


あなたはinput_dictsオブジェクトはこのように見て考えてみましょう:

>>> inputs_dict = {'even-values': {1:2, 3:4, 5:6, 7:8, 9:10, 11:12, 13:14, 15:16, 17:18, 19:20}} 

そして、あなたはinput_array[i,:] = np.array(list(inputs_dict[i].values()))の左側のスライドにそれに合うようにしたい:今、私たちは持っている場合

>>> inputs = np.zeros([3,10]) 
>>> inputs[1,:] 
array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]) 
# Check the shape of left-side. 
>>> inputs[1,:].shape 
(10,) 


>>> inputs_dict = {'even-values': {1:2, 3:4, 5:6, 7:8, 9:10, 11:12, 13:14, 15:16, 17:18, 19:20}} 
>>> inputs_dict['even-values'].values() 
dict_values([2, 4, 6, 8, 10, 12, 14, 16, 18, 20]) 
>>> np.array(list(inputs_dict['even-values'].values())) 
array([ 2, 4, 6, 8, 10, 12, 14, 16, 18, 20]) 

# Check shape of right-side. 
>>> np.array(list(inputs_dict['even-values'].values())).shape 


# Voila, it fits: 
>>> inputs[1,:] = np.array(list(inputs_dict['even-values'].values())) 
>>> inputs 
array([[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 
     [ 2., 4., 6., 8., 10., 12., 14., 16., 18., 20.], 
     [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]]) 

いいえ。 inputs_dict['even-values']左側の同じを当てはめるないの値のあなたは、あなたの質問にエラーが発生します:

>>> inputs = np.zeros([3,10]) 

>>> inputs_dict = {'even-values': {1:2, 3:4, 5:6, 7:8, 9:10, 11:12, 13:14}} 

>>> np.array(list(inputs_dict['even-values'].values())) 
array([ 2, 4, 6, 8, 10, 12, 14]) 

# Right-side shape. 
>>> np.array(list(inputs_dict['even-values'].values())).shape 
(7,) 

# Left-side shape. 
>>> inputs[1,:].shape 
(10,) 

>>> inputs[1,:] = np.array(list(inputs_dict['even-values'].values())) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: could not broadcast input array from shape (7) into shape (10) 

データ構造

あなたのデータからを構造化する多くの方法があります。 input_dictsにあるものの外見は、遺伝子配列カウンターのように見えます。

実際にデータを構造化するための正しい方法と間違った方法はありませんが、常により良い方法があります。

ご質問最新の編集を見ると、あなたが投稿した:

>>> input_dicts = [{'CGC': 3, 'T': 29, 'GTT': 3, 'AGG': 1, 'GGG': 0, 'ATG': 3, 'TA': 2, 'AAT': 1, 'TTT': 3, 'CGA': 1, 'GGT': 0, 'GTA': 1, 'ACT': 2, 'TTA': 1, 'CAA': 3, 'CG': 6, 'GCA': 1, 'TAG': 0, 'AA': 10, 'C': 22, 'AGT': 2, 'GAG': 0, 'ATC': 4, 'CTA': 0, 'GA': 7, 'AAG': 3, 'GAT': 4, 'AGC': 0, 'CTT': 3, 'CAG': 1, 'TGA': 4, 'AAA': 3, 'CCT': 1, 'GAC': 0, 'ATT': 1, 'A': 28, 'GTC': 0, 'CTC': 0, 'TTC': 3, 'CAC': 2, 'AT': 8, 'CA': 9, 'TGC': 2, 'TGT': 2, 'GC': 6, 'TAT': 0, 'G': 21, 'CCA': 1, 'ATA': 0, 'TC': 7, 'TCC': 1, 'TGG': 1, 'CAT': 3, 'AGA': 1, 'AC': 6, 'TT': 10, 'TCA': 4, 'GCC': 1, 'ACG': 2, 'TAA': 1, 'GTG': 2, 'TG': 9, 'CTG': 1, 'CGG': 0, 'GAA': 3, 'GGC': 1, 'CCG': 0, 'TTG': 2, 'AG': 4, 'TCT': 1, 'GT': 6, 'ACA': 2, 'GCT': 0, 'TAC': 1, 'GGA': 1, 'GG': 2, 'CC': 2, 'ACC': 0, 'CGT': 2, 'TCG': 1, 'GCG': 3, 'AAC': 3, 'CT': 4}, {'CGC': 3, 'T': 27, 'GTT': 1, 'AGG': 0, 'GGG': 0, 'ATG': 2, 'TA': 4, 'AAT': 3, 'TTT': 3, 'CGA': 1, 'GGT': 1, 'GTA': 1, 'ACT': 1, 'TTA': 2, 'CAA': 1, 'CG': 6, 'GCA': 2, 'TAG': 0, 'AA': 8, 'C': 24, 'AGT': 1, 'GAG': 3, 'ATC': 2, 'CTA': 0, 'GA': 7, 'AAG': 1, 'GAT': 2, 'AGC': 2, 'CTT': 1, 'CAG': 2, 'TGA': 2, 'AAA': 3, 'CCT': 0, 'GAC': 0, 'ATT': 3, 'A': 26, 'GTC': 0, 'CTC': 3, 'TTC': 2, 'CAC': 2, 'AT': 8, 'CA': 7, 'TGC': 2, 'TGT': 2, 'GC': 8, 'TAT': 1, 'G': 23, 'CCA': 1, 'ATA': 1, 'TC': 7, 'TCC': 1, 'TGG': 2, 'CAT': 2, 'AGA': 3, 'AC': 4, 'TT': 8, 'TCA': 2, 'GCC': 1, 'ACG': 0, 'TAA': 2, 'GTG': 2, 'TG': 8, 'CTG': 2, 'CGG': 1, 'GAA': 2, 'GGC': 1, 'CCG': 2, 'TTG': 1, 'AG': 6, 'TCT': 3, 'GT': 4, 'ACA': 2, 'GCT': 2, 'TAC': 1, 'GGA': 1, 'GG': 3, 'CC': 4, 'ACC': 1, 'CGT': 0, 'TCG': 1, 'GCG': 3, 'AAC': 1, 'CT': 6}] 

あなたは慎重に見ると、あなただけの各内部辞書のキーと値のペアで83個の要素があります。

>>> len(input_dicts[0].keys()) 
83 

>>> len(input_dicts[1].keys()) 
83 

したがって、1×83アレイを持つ1×84サイズのアレイであるinput_array[i,:]を上書きしようとすると、値エラーが発生します。

あり、アレイは、あなたが

>>> import numpy as np 
>>> x = np.array([0,1,2,3]) 

>>> pad_left_column = 3 
>>> pad_right_column = 2 
>>> pad_top_row = 4 
>>> pad_bottom_row = 5 

>>> np.pad(x, [(pad_left_column, pad_right_column)], mode='constant') 
array([0, 0, 0, 0, 1, 2, 3, 0, 0]) 

を必要とする形状になるためのパッドに方法があるが、通常の列の順序は、いくつかの意味を持ち、単に形状が正しいにするためにゼロをパディングするので、私はそれに対して助言します望ましくないかもしれない。

+0

np.array(list(inputs_dict [0] .values()))。shapeは、期待通りに(83、)の出力を与えます。しかし、この配列のサイズに合わせて初期化された配列を変更すると、シェイプが(84、)であるというエラーが表示されます。これはプログラミングロジックを無視し、辞書やそれを使用して作成された配列が変更されているどのような形でも、形や形... –

関連する問題