можно ли вернуть строку после сравнения в NumPy? - PullRequest
0 голосов
/ 13 января 2020

Я написал код для сравнения строки в массиве с использованием CSV. Вот пример набора данных

Doc   Cited_Doc
A     B | F | G
B     V | T
C     A | O | U | P | M

, а вот мой код

Input = np.loadtxt('C1_100.csv', delimiter=',' , dtype='unicode')

NumOfDoc = len(Input[:,1])
NumOfCol = len(Input[1,:])

for i in range(1, NumOfDoc):
    Cited = Input[:,1]
    Citing = Input[:,0]

bb=1 

for i in range(1, NumOfDoc):
    for j in range(1, NumOfDoc):
        #aa = np.core.defchararray.equal(Citing, Cited)
        aa =  np.isin(Citing, Cited)
        CitingCited = []
        if np.all(aa!=0):
            if bb==1:
                #CitingCited = [Citing[j],Citing[i]]
                a = np.core.defchararray.add(Citing[j], Citing[i])
                CitingCited.append(a)
            if bb>1:
                #CitingCited[bb,1]= Citing[j]
                #CitingCited[bb,1]= Citing[j]
                CitingCited.append(Citing[j])
                CitingCited.append(Citing[j])

        bb=bb+1

print('CitingCited')

После сравнения, и я попытался напечатать aa, результат возвращается

array([True,True,False])

и когда я печатаю CitingCited, результат возвращается

[]

, но я ожидаю увидеть результат, когда я печатаю CitingCited (результат, возвращающий True)

a = np.core.defchararray.add(Citing[j], Citing[i])
                    CitingCited.append(a)

, как это

Doc Cited_Doc
A     C
B     A

есть предложения?

1 Ответ

0 голосов
/ 13 января 2020

Посмотрим, смогу ли я восстановить ваши данные:

In [1]: txt ="""A,B|F|G 
   ...: B,V|T 
   ...: C,A|O|U|P|M 
   ...: """                                                                                               
In [2]: data = np.loadtxt(txt.splitlines(),delimiter=',',dtype='unicode')                                 
In [3]: data                                                                                              
Out[3]: 
array([['A', 'B|F|G'],
       ['B', 'V|T'],
       ['C', 'A|O|U|P|M']], dtype='<U9')
In [4]: n,m = data.shape                                                                                  
In [5]: n,m                                                                                               
Out[5]: (3, 2)

Тогда вы l oop:

In [6]: for i in range(1,n): 
   ...:     cited=data[:,1] 
   ...:     citing=data[:,0] 
   ...:                                                                                                   
In [7]: cited                                                                                             
Out[7]: array(['B|F|G', 'V|T', 'A|O|U|P|M'], dtype='<U9')
In [8]: citing                                                                                            
Out[8]: array(['A', 'B', 'C'], dtype='<U9')

Вы не используете i в l oop. Почему я oop вообще? Я собирался спросить, почему старт 1 в l oop, но понял, что в моем примере нет строки заголовка, которую вы пропускаете.

В любом случае, теперь у вас есть два 1d массива строки dtype.

На следующем шаге вы снова l oop, дважды, но опять же, целые столбцы, а не i'th или j'th элементов.

In [12]: np.isin(citing, cited)                                                                           
Out[12]: array([False, False, False])

Что должен * isin обнаруживать? Он сравнивает элементы двух массивов. Ни один из элементов citing не появляется в cited (да, «B» является подстрокой в ​​«B | F | G», но это не то, что isin проверяет.

Мы могли бы проверить cited на элементы citing, если мы разделим их на '|'.

In [18]: np.isin(['A','B','C'], ['B','F','G'])                                                            
Out[18]: array([False,  True, False])
In [20]: np.isin(['A','B','C'], ['V','T'])                                                                
Out[20]: array([False, False, False])
In [21]: np.isin(['A','B','C'], ['A','O','U'])                                                            
Out[21]: array([ True, False, False])

Мы можем использовать обычные строковые операции, чтобы проверить, какие строки citing найдены в строках cited:

In [27]: [s for s in citing if s in cited[0]]                                                             
Out[27]: ['B']
In [28]: [s for s in citing if s in cited[1]]                                                             
Out[28]: []
In [29]: [s for s in citing if s in cited[2]]                                                             
Out[29]: ['A']

Я мог бы go включить, но на данный момент ясно, что это не очень большая проблема numpy. Подумайте вместо двух строк списков.

В Факт, чтобы сделать это более явным:

In [30]: Alist= citing.tolist(); Blist=cited.tolist()                                                     
In [31]: Alist, Blist                                                                                     
Out[31]: (['A', 'B', 'C'], ['B|F|G', 'V|T', 'A|O|U|P|M'])

И это Blist может быть далее разделено на список списков:

In [32]: [s.split('|') for s in Blist]                                                                    
Out[32]: [['B', 'F', 'G'], ['V', 'T'], ['A', 'O', 'U', 'P', 'M']]

Как я писал в комментарии, pandas использует объект dtype для строк, а строки - обычные Python строки. numpy вместо этого использует <U9 строки dtypes. Я не знаю достаточно pandas, чтобы сказать, добавил ли он строковые утилиты, но я подозреваю, что обычные Python строковых утилит достаточно.

np.char имеет функции, которые применяют строковые методы к элементам массива. Это может быть удобно, но они не предлагают никаких улучшений скорости.

Разделение Out[32] также можно выполнить:

In [34]: np.char.split(cited, '|')                                                                        
Out[34]: 
array([list(['B', 'F', 'G']), list(['V', 'T']),
       list(['A', 'O', 'U', 'P', 'M'])], dtype=object)

core.defchararray - это просто еще один способ доступа к этим функциям:

In [40]: np.core.defchararray.add                                                                         
Out[40]: <function numpy.char.add(x1, x2)>

Использование вами Cited и Citing для двух имен столбцов сбивают с толку. Да, они имеют в виду разные вещи, но я должен был постоянно возвращаться к определениям, чтобы отслеживать, какая переменная была какой. Один список docs другой список цитат.

Мой совет - пропустите все использование pandas и numpy на данный момент, и сосредоточьтесь на правильных совпадениях строк. Это проблема Python списка строк. Убедитесь, что ваши итерации имеют смысл на каждом этапе!

...