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

时间:2017-12-28 05:54:18

标签: python arrays numpy dictionary

这部分代码的目标是获取字典列表,获取特定字典,使用此字典的值来创建列表,将列表转换为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导入为pd     来自收藏品进口柜台     进口火炬     来自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}]

1 个答案:

答案 0 :(得分: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数组的一行:

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)

数据结构

有许多方法可以构建数据,从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数组覆盖{1}} 1x84大小的数组时,会抛出值错误。

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

input_array[i,:]

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