2017-12-28 3 views
0

Das Ziel dieses Codeabschnitts besteht darin, eine Liste von Wörterbüchern zu erstellen, ein bestimmtes Wörterbuch zu erstellen und die Werte dieses Wörterbuchs zu verwenden , um die Liste in ein numpy Array umzuwandeln und dies für alle 3399 Wörterbücher (len (X)) zu tun, die ich in den vorherigen Abschnitten meines Codes erstellt habe. Jeder Schritt dieses Prozesses glatt ging, bis ich zum letzten Teil bekamValueError: konnte kein Eingabearray von Shape (83) in Shape senden (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())) 

Wenn diese Zeilen Code durchgeführt wird, wird der folgende Fehler erscheint:

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

Nun, die Lösung ganz offensichtlich scheint, Recht? Ändern Sie einfach die Dimensionen des initialisierten Arrays und alles wird behoben ... nicht ganz. Ändern der Dimensionen wie folgt ergibt ein sehr seltsames Ergebnis, das ich einfach nicht umgehen kann, egal was ich tue oder versuche.

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) 

die Dimension des initialisierten Array ändern ändert irgendwie die Dimensionen meiner bereits vorgefertigte Array, das in die große 2D-Array-Struktur gesetzt werden muss.

Ich habe wirklich versucht, dieses Problem zu umgehen, jede mögliche Funktion die ich finden konnte, einschließlich Umbildung, Anhängen, verketten, Stapeln, ...

Es wäre eine massive Hilfe sein, wenn es eine Lösung für dieses Problem wäre/ein einfacher Weg, die Werte aus einer Liste von Wörterbüchern zu nehmen und sie in ein numpliges Array zu bringen.

Voll Code: Import numpy als np Import Pandas als pd aus Sammlungen Zähler Import Fackel aus Fackel Import autograd importieren, nn

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())) 

der Ausgang für inputs_dict [0: 2] ergibt:

[{'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

Was ist in 'inputs_dict'? Könnten Sie eine Probe dieses Objekts geben? – alvas

+0

[mcve] bitte ... – Julien

+0

meine Vermutung ist, dass ein Dicts-Element 84 Begriffe hat und ein anderer 83 hat. Vergewissere dich, dass du die Quelle verstehst. – hpaulj

Antwort

1

TL; DR

Überprüfen Sie, was sich in Ihrem Objekt inputs_dict befindet.


In Lange

Wenn Sie np.zeros([x, y]) verwenden gibt es eine Matrix von x Zeilen und y mit Nullwerten gefüllt Spalten:

>>> 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) 

Wenn Sie range(x, y) verwenden, wird es eine Liste Start zurückkehren für x und endend bei y-1:

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

Und tun thi s würde eine Zeile der numpy Array mit einer Liste von Schwimmern überschreiben:

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

Anfänglich:

>>> 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.]]) 

Überschreiben Folge:

>>> 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.]]) 

Solange die linke und die rechte Seite von inputs[i,:] = [0,1,2,3,4,5,6,7,8,9] ist die gleiche Größe, sollte es die Zeile erfolgreich überschreiben. Andernfalls finden Sie den gleichen Fehler in Ihrer Frage.

>>> 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 

Deins Code zurück, um zu wissen, was Sie die Größe der rechten Seite der input_array[i,:] = np.array(list(inputs_dict[i].values())) falsch ist und sehen, um zu überprüfen, ob es die gleiche Form ist.


Können sagen, Sie haben das input_dicts Objekt wie folgt aussehen:

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

Und Sie wollen es in die linke Rutsche von input_array[i,:] = np.array(list(inputs_dict[i].values())) passen:

>>> 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.]]) 

Wenn wir jetzt haben Das Nein. von Werten in den inputs_dict['even-values'] nicht das gleiche von der linken Seite passend finden Sie den Fehler in der Frage auftreten:

>>> 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) 

Datenstrukturen

Es gibt viele Möglichkeiten, um Ihre Daten zu strukturieren und aus das Aussehen von was ist in , es sieht aus wie ein genetischer Sequenzzähler.

Es gibt nicht wirklich einen richtigen/falschen Weg, um Ihre Daten zu strukturieren, aber es gibt immer einen besseren Weg.

auf Ihre Fragen zu den neuesten Änderungen suchen, sind Sie auf dem Laufenden:

>>> 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}] 

Wenn Sie genau hinschauen, können Sie nur 83 Elemente in jedem inneren Wörterbuch Schlüssel-Wert-Paare haben:

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

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

Wenn Sie also versuchen, das input_array[i,:] zu überschreiben, das ein 1x84-Array mit einem 1x83-Array ist, wird ein Wertfehler ausgegeben.

Es gibt Möglichkeiten, um Pad, um die Anordnung der Form, die Sie

>>> 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]) 

brauchen zu werden, aber ich würde dagegen raten, da in der Regel die Reihenfolge der Spalten einige Bedeutung und einfach padding Nullen haben die Form richtig zu machen möglicherweise nicht wünschenswert.

+0

np.array (list (input_dict [0] .values ​​())). Shape zum Beispiel gibt eine Ausgabe von (83,) wie erwartet. Wenn jedoch das initialisierte Array geändert wird, um diese Größe des Arrays, das eingefügt werden soll, zu ändern, wird der Fehler gegeben, dass die Form (84) ist, was jeder Programmierlogik widerspricht, da das Dictionary oder das Array, das verwendet wird, geändert wird in irgendeiner Weise, Form oder Form ... –