2016-12-06 2 views
2

Я пытаюсь добавить строку в numpy.array в цикле и не работает, хотя я не получаю никаких ошибок. Моя общая цель - сравнить два файла и создать третий файл, суммирующий сравнение.Добавление элементов в массив в цикле

ipython

import numpy as np 

мои массивы

aList1=np.array([['A','we'],['A','we'],['B','we'],['C','de']]) 
aList2=np.array([['A'],['B'],['D']]) 
aResult=np.array(['row1','occurence']) 

моя функция

def coverageA(array,file1,name1,colum1,file2,name2,colum2): 
    x=file1[1:,colum1] 
    y=file2[1:,colum2] 
    for f in x: 
     if f in y: 
      array=np.vstack((array,np.array([f,'shared']))) 
     else: 
      array=np.vstack((array,np.array([f,name1]))) 
    for f in y: 
     if f not in x: 
      array=np.vstack((array,np.array([f,name2]))) 
    return 

и использовать это таким образом

coverageA(aResult,alist1,'list1', 0,aList2,'list',0)

но aResult не изменял

print(aResult) output:(['row1','occurence'])

хотел

([['row1','occurence'],['A', 'shared'],['B', 'shared'],['C','list1'],['D','list2']])

ответ

1

отремонтировали:

import numpy as np 

#my arrays 

aList1=np.array([['A','we'],['A','we'],['B','we'],['C','de']]) 
aList2=np.array([['A'],['B'],['D']]) 
aResult=np.array(['row1','occurence']) 

#my function 

def coverageA(array,file1,name1,colum1,file2,name2,colum2): 
    x=file1[1:,colum1] 
    y=file2[1:,colum2] 
    for f in x: 
     if f in y: 
      array=np.vstack((array,np.array([f,'shared']))) 
     else: 
      array=np.vstack((array,np.array([f,name1]))) 
    for f in y: 
     if f not in x: 
      array=np.vstack((array,np.array([f,name2]))) 
    print(array) 
    return array 

#and use it this way 

aResult=coverageA(aResult,aList1,'list1', 0,aList2,'list2',0) 
#but aResult didn't change 

print(aResult) 
#output:(['row1','occurence']) 
#wanted 

#([['row1','occurence'],['A', 'shared'],['B', 'shared'],['C','list1'],['D','list2']]) 

Объяснение состоит в том, что в аргументах python передаются присваиванием, что хорошо объясняется here. В строке array=np.vstack((array,np.array([f,'shared']))) новый массив numpy создается при новой памяти im память (массив указывает на это), но aResult все еще указывает на свою прежнюю позицию. Вы можете проверить адреса памяти с помощью print(id(array)).

Смежные вопросы