代码之家  ›  专栏  ›  技术社区  ›  Siddharth Satpathy

比较条目为字符串的numpy数组,并查找字符串的位置

  •  0
  • Siddharth Satpathy  · 技术社区  · 6 年前

    我有 两个条目为字符串的numpy数组 . 第一个数组( array1 )他身材匀称 ( m, n ) 其中m>1和n>1.第二个数组( array2 )他身材匀称 (p, ) ,其中p是大于1的整数。 ,而array1可能具有相同字符串的多个实例。

    我想 用另一个阵列替换阵列1 形状相同(与阵列1相同), . 这些指数通过以下方式获得: 比较array1和array2的条目 . array1的每个条目肯定会与array2的某些条目匹配。

    下面是一个小例子:

    import numpy as np
    
    array1 = np.asarray([['aa', 'cc', 'bb', 'aa', 'aa', 'bb'],
                       ['cc', 'bb', 'cc', 'bb', 'aa', 'aa'],
                       ['bb', 'cc', 'aa', 'aa', 'bb', 'cc']])
    
    array2 = np.asarray(['aa', 'bb', 'cc'])
    

    这就是我目前处理问题的方式:

    for k in range(array1.shape[0]):
        array1[k] = np.asarray([j for i in range(array1.shape[1]) for j in range(len(array2)) if array1[k,i]==array2[j]]) 
    
    print array1
    
    [['0' '2' '1' '0' '0' '1']
     ['2' '1' '2' '1' '0' '0']
     ['1' '2' '0' '0' '1' '2']]
    

    但是,当我使用具有大量行和列的array1时,我发现上面提到的方法不是很快。

    有什么更快的方法可以完成我想要的任务?

    2 回复  |  直到 6 年前
        1
  •  3
  •   Divakar    6 年前

    所有条目都来自 array2 出现在 array np.searchsorted -

    sidx = array2.argsort()
    out = sidx[np.searchsorted(array2,array1.ravel(),sorter=sidx).reshape(array1.shape)]
    

    如果 argsort 以及相应的索引步骤-

    out = np.searchsorted(array2,array1.ravel()).reshape(array1.shape)
    
        2
  •  1
  •   Dani Mesejo    6 年前

    一种可能的替代方案:

    import numpy as np
    
    array1 = np.asarray([['aa', 'cc', 'bb', 'aa', 'aa', 'bb'],
                         ['cc', 'bb', 'cc', 'bb', 'aa', 'aa'],
                         ['bb', 'cc', 'aa', 'aa', 'bb', 'cc']])
    
    array2 = np.asarray(['aa', 'bb', 'cc'])
    
    d = {v: k for k, v in enumerate(array2)}
    result = np.vectorize(d.get)(array1)
    
    print(result)
    

    [[0 2 1 0 0 1]
     [2 1 2 1 0 0]
     [1 2 0 0 1 2]]