【问题标题】:is it possible to return string after comparison in NumPy?在 NumPy 中比较后是否可以返回字符串?
【发布时间】:2020-04-29 18:20:59
【问题描述】:

我编写了一个代码,它将使用 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

有什么建议吗?

【问题讨论】:

  • 变量和函数名称应遵循lower_case_with_underscores 样式。为什么要使用这个 NumPy?此外,引用文档,chararray 类的存在是为了向后兼容 Numarray,不建议用于新开发。从 numpy 1.4 开始,如果需要字符串数组,建议使用 dtype object、string 或 unicode 数组,并使用 numpy.char 模块中的 free 函数进行快速向量化字符串操作。
  • 我正在使用 numpy,因为我听说它比 pandas 运行得更快。
  • 你从哪里听到的?性能是一个复杂的话题,我认为 NumPy 和 Pandas 一开始都不是竞争对手。你能分享一下你的数据是什么样子的吗?
  • 我从朋友那里听说的。我的数据看起来就像我写的那样。它有 2 列,一列是主文档,第二列是引用文档列表
  • 我的数据看起来和我写的一样。它有 2 列,一列是主文档,第二列是引用文档列表我只是想检查格式,它们是字母数字字符串吗?

标签: python arrays string numpy compare


【解决方案1】:

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

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 改为使用 &lt;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 字符串列表问题。确保您的迭代在每一步都有意义!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    • 2018-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    相关资源
    最近更新 更多