是否可以在 NumPy 中比较后返回字符串?



我写了一个代码,将使用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'thj'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)>

您对两个列名称使用CitedCiting会令人困惑。 是的,它们意味着不同的东西,但我不得不不断参考定义以跟踪哪个变量是哪个变量。 一个是docs列表,另一个是引文列表。

我的建议 - 暂时跳过整个pandasnumpy用法,并专注于使字符串匹配正确。 这是一个 Python 字符串列表问题。 确保每一步的迭代都有意义!

相关内容

  • 没有找到相关文章