2017-12-28 3 views
0

이 코드의 목적은 사전 목록을 가져와 특정 사전을 가져온 다음이 사전의 값을 사용하여 목록을 작성하는 것입니다 목록을 수십 개의 배열로 변환하고 이전 코드 섹션에서 빌드 한 3399 개의 사전 (len (X))에 대해이 작업을 수행 할 수 있습니다. 내가 마지막 부분ValueError : 입력 배열을 shape (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) 

어떻게 든 큰 2 차원 배열 구조에 투입 될 필요가 내 이미 미리 만들어진 배열의 크기를 변경합니다.

은 정말 /이 문제에 대한 해결책이있을 것입니다 경우

그것은 엄청난 도움이 될 것입니다 ..., 스태킹, 재편을 포함하여 내가 찾을 수있는 가능한 모든 기능을 사용하여이 문제를 우회 추가, 합치 시도 사전 목록에서 값을 가져 와서 숫자가 적은 배열에 넣는 더 쉬운 방법입니다.

전체 코드 :

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

내 생각에 하나의 dicts 요소에는 84 개의 용어가 있고 다른 요소에는 83이 있습니다. 소스를 이해했는지 확인하십시오. – hpaulj

답변

1

TL; DR

inputs_dict 개체의 내용을 확인하십시오.긴

에서


당신이 np.zeros([x, y])를 사용하는 제로 값 가득 X 행과 Y 열의 매트릭스 반환 : 당신이 range(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) 

,이 목록의 시작을 반환됩니다 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.]]) 

을들 플로트 목록으로 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에있는 것의 모습은 유전자 서열 카운터처럼 보입니다.

실제로 데이터를 구성하는 데있어 옳고 그른 방법은 없지만 항상 좋은 방법이 있습니다. 질문에 대한 최신 편집 내용을 보면

는, 당신은 게시 한 :

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

>>> len(input_dicts[1].keys()) 
83 
:주의 깊게 보면

>>> 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 개 요소가

당연히 1x83 배열의 1x84 크기 배열 인 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을 갖고 있기 때문에 나는 그 무리를 줄 것이다 바람직하지 않을 수 있습니다.

+0

np.array (list (inputs_dict [0] .values ​​())). 모양은 예상대로 (83,)의 출력을 제공합니다. 그러나 배열의 크기를 수용하기 위해 초기화 된 배열을 변경할 때 모양에 (84)가 주어지면 프로그래밍 논리를 무시하고 사전이나 배열을 사용하여 만들어진 배열이 변경된 것을 확인하는 오류가 발생합니다 어떤 식 으로든, 모양이나 형태 ... –

관련 문제