2016-12-04 3 views
0

Почему он не добавляет все списки?Numpy append array не работает

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

Что это такое? Не просто покажите код. Покажите результаты и объясните, что не так. – hpaulj

ответ

0

numpy.append возвращает новый NumPy массив, в то время как ваш код показывает, что вы думаете, это добавление новых значений testarray. Массив не добавляется на месте, а новый массив должен быть создан и заполнен данными, таким образом скопировав как testarray, так и test[file]['subfile1'].

Также обратите внимание, что нет необходимости перебирать ключи и извлекать значение из словаря одним из этих ключей. Вы можете цикл по элементов массив содержит, в том числе как ключи и значения:

for key, value in test.items(): 
    print(value['subfile1']) 
    ... 
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, но я предпочел бы не так. Слишком много плакатов злоупотребляют им.