Посмотрим, смогу ли я восстановить ваши данные:
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 списка строк. Убедитесь, что ваши итерации имеют смысл на каждом этапе!