我有两个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时,我发现上述方法不是很快。
完成我想要的任务的更快方法是什么?
答案 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]]