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

2024-04-27 11:51:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经编写了一段代码,将使用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])

当我打印CitingQuieted时,结果会被返回

[]

但我希望在打印CitingQuieted时看到结果(返回True的结果)

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

像这样

Doc Cited_Doc
A     C
B     A

有什么建议吗


Tags: incoreforinputdocnprangeaa
1条回答
网友
1楼 · 发布于 2024-04-27 11:51:28

让我们看看是否可以重新创建您的数据:

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在循环中开始,但意识到我的示例没有标题行,您正在跳过

在任何情况下,您现在拥有的是两个字符串数据类型的1d数组

在下一步中,您将再次循环两次整个列,而不是i'thj'th元素

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

这个isin应该检测什么?它比较两个数组的元素。{}的元素没有一个出现在{}中(是的,'B'是'B | F | G'中的子串),但这不是{}测试的目的

如果我们在“|”上拆分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])

我们可以使用普通字符串操作来测试在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'])

而且{}可以进一步分成一个列表:

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

正如我在一篇评论中所写的,pandas使用对象数据类型作为字符串,字符串是普通的Python字符串。numpy而是使用<U9字符串数据类型。我不知道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)

{}只是访问这些函数的另一种方式:

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

你用CitedCiting作为两个列名是令人困惑的。是的,它们的意思不同,但我必须不断引用定义来跟踪哪个变量是哪个变量。一个是docs的列表,另一个是引用列表

我的建议-现在跳过整个pandasnumpy用法,集中精力让字符串匹配正确。这是一个Python字符串列表问题。确保您的迭代在每一步都有意义

相关问题 更多 >