Numpy追加阵列不起作用

时间:2016-12-04 18:19:14

标签: python numpy

为什么不附加所有列表?

test = {'file1':{'subfile1':[1,2,3],'subfile2':[10,11,12]},'file5':{'subfile1':[4,678,6]},'file2':{'subfile1':[4,78,6]},'file3':{'subfile1':[7,8,9]}}
testarray = np.array([50,60,70])
for file in test.keys():
    print(test[file]['subfile1'])
    subfile1 = np.append(testarray, test[file]['subfile1'])
print(subfile1)

2 个答案:

答案 0 :(得分:0)

numpy.append会返回一个新的NumPy数组,而您的代码显示您认为它正在向testarray添加新值。数组未就地附加,必须创建新数组并填充数据,从而复制testarraytest[file]['subfile1']

另外,请注意,不需要循环键并通过其中一个键从字典中提取值。您可以循环遍历数组包含的,包括键和值:

for key, value in test.items():
    print(value['subfile1'])
    ...

答案 1 :(得分:0)

不是重复地将列表连接到数组,而是收集列表中的值,并仅构建一次数组。它更快,更不容易出错:

In [514]: test
Out[514]: 
{'file1': {'subfile1': [1, 2, 3], 'subfile2': [10, 11, 12]},
 'file2': {'subfile1': [4, 78, 6]},
 'file3': {'subfile1': [7, 8, 9]},
 'file5': {'subfile1': [4, 678, 6]}}
In [515]: data=[test[f]['subfile1'] for f in test]
In [516]: data
Out[516]: [[1, 2, 3], [4, 78, 6], [7, 8, 9], [4, 678, 6]]
In [517]: np.array(data)
Out[517]: 
array([[  1,   2,   3],
       [  4,  78,   6],
       [  7,   8,   9],
       [  4, 678,   6]])

如果必须,请迭代地构建列表:

In [518]: data=[]
In [519]: for f in test.keys():
     ...:     data.append(test[f]['subfile1'])

你可以在每一步连接:

In [521]: testarray=np.array([50,60,70])
In [522]: for file in test.keys():
     ...:     testarray = np.concatenate((testarray, test[file]['subfile1']))
     ...:     
In [523]: testarray
Out[523]: 
array([ 50,  60,  70,   1,   2,   3,   4,  78,   6,   7,   8,   9,   4,  678,   6])

请注意,这会将所有值放在一个1d数组中,而不是先前方法所做的2d数组。我们可以vstack去2d(它也使用concatenate)。

In [525]: testarray=np.array([50,60,70])
In [526]: for file in test.keys():
     ...:     testarray = np.vstack((testarray, test[file]['subfile1']))
     ...:     
     ...:     
In [527]: testarray
Out[527]: 
array([[ 50,  60,  70],
       [  1,   2,   3],
       [  4,  78,   6],
       [  7,   8,   9],
       [  4, 678,   6]])

我也可以用append写这个,但我不想。太多的海报误用了它。