我写了一个代码,将使用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])
当我打印引用引用时,返回结果
[]
但我希望在打印引用时看到结果(返回 True 的结果(
a = np.core.defchararray.add(Citing[j], Citing[i])
CitingCited.append(a)
喜欢这个
Doc Cited_Doc
A C
B A
有什么建议吗?
让我们看看我是否可以重新创建您的数据:
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)
然后循环:
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
。 为什么要循环? 我本来想问为什么 1 在循环中开始,但意识到我的样本没有标题行,您正在跳过该行。
无论如何,您现在拥有的是两个字符串 dtype 的一维数组。
在下一步中,您将再次循环两次,但再次循环整个列,而不是i'th
或j'th
元素。
In [12]: np.isin(citing, cited)
Out[12]: array([False, False, False])
isin
应该检测什么? 它比较两个数组的元素。citing
的所有元素都没有出现在cited
(是的,"B"是"B|F|G',但这不是isin
要测试的。
我们可以针对citing
元素测试cited
,如果我们将它们拆分为"|"。
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])
我们可以使用普通字符串操作来测试在cited
字符串中找到哪些citing
字符串:
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']
我可以继续说下去,但很明显,这不是一个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 字符串列表问题。 确保每一步的迭代都有意义!