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

时间:2018-11-29 10:00:08

标签: python numpy

我有两个numpy数组,其条目为字符串。第一个数组(array1)的形状为( m, n ),其中m> 1和n> 1。第二个数组(array2)的形状为(p, ),其中p是大于1的整数。 array2中的条目不重复(即,它们是唯一的),而array1可能具有相同字符串的多个实例。

我想用相同形状(与array1)相同的另一个数组替换,方法是通过包含索引(数字)代替字符串。这些索引是通过将array1的条目与array2进行比较获得的。数组1的每个条目必定与数组2的某些条目匹配。

速度在这里很重要,我想找到最快的方法。

这是一个小例子:

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 个答案:

答案 0 :(得分:3)

array2中出现了array中的所有条目,我们可以使用np.searchsorted-

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

如果array2已经排序,我们可以跳过argsort和相应的索引步骤-

out = np.searchsorted(array2,array1.ravel()).reshape(array1.shape)

答案 1 :(得分:1)

可能的替代方法:

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]]