ValueError:无法将形状(83)的输入数组广播为形状(84)

问题描述 投票:0回答:1

这部分代码的目标是获取字典列表,获取特定字典,使用此字典的值来创建列表,将列表转换为numpy数组,并为所有3399个字典执行此操作(len (X))我已经在我的代码的前几节中构建了。这个过程的每一步都很顺利,直到我到达最后一部分

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数组结构中。

我真的试图使用我能找到的每一个可能的功能来绕过这个问题,包括重塑,追加,连接,堆叠......

如果有一个解决这个问题的方法/一个更简单的方法从字典列表中取出值并将它们放入一个numpy数组中,那将是一个巨大的帮助。

完整代码:导入numpy作为np导入pandas as pd from collections import导入火炬来自torch import autograd,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()))

inputs_dict [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}]
python arrays numpy dictionary
1个回答
1
投票

TL;DR

检查你的inputs_dict对象里面有什么。


In Long

当您使用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数组的一行:

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

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

Data structures

有许多方法可以构建您的数据,从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

很自然地,当您尝试用1x83数组覆盖qxxswpoi(1x84大小的数组)时,会抛出值错误。

有一些方法可以填充阵列以成为您需要的形状

input_array[i,:]

但我建议反对,因为通常列的顺序有一些含义,简单地填充零以使形状正确可能是不可取的。

© www.soinside.com 2019 - 2024. All rights reserved.