2017-02-23 17 views
1

说我有这两个数组:如何将一个非整数 - >整数字典应用于一个numpy数组?

dictionary = np.array(['a', 'b', 'c']) 
array = np.array([['a', 'a', 'c'], ['b', 'b', 'c']]) 

而且我想与其在dictionary价值的指标来代替每个元素array。所以:

for index, value in enumerate(dictionary): 
    array[array == value] = index 
array = array.astype(int) 

要获取:

array([[0, 0, 2], 
     [1, 1, 2]]) 

是否有一个量化的方式来做到这一点?我知道如果array已经包含索引,并且我想要dictionary中的字符串,那么我可以只做dictionary[array]。但是我在这里实际上需要对字符串进行“查找”。

(我也看到this answer,但不知道是否新的东西是可用自2010年起),如果你的字典排序

回答

2

和字典和数组包含相同的元素,np.unique的伎俩

uniq, inv = np.unique(array, return_inverse=True) 
result = inv.reshape(array.shape) 

如果一些元素中缺少阵列:

uniq, inv = np.unique(np.r_[dictionary, array.ravel()], return_inverse=True) 
result = inv[len(dictionary):].reshape(array.shape) 

一般情况下:

uniq, inv = np.unique(np.r_[dictionary, array.ravel()], return_inverse=True) 
back = np.empty_like(inv[:len(dictionary)]) 
back[inv[:len(dictionary)]] = np.arange(len(dictionary)) 
result=back[inv[len(dictionary):]].reshape(array.shape) 

说明:np.unique在我们使用的是在这里返回排序的独特元素和指标到这个排序的参数的每个元素的列表形式。因此,要将索引放入原始字典中,我们需要重新映射索引。我们知道uniq[inv[:len(uniq)]] == dictionary。因此我们必须解决代码所做的X[inv[:len(uniq)]] == np.arange(len(uniq))

+0

非常整齐!谢谢。稍等一下,看看是否有人对未排序的字典有一个通用的解决方案。 (你有点绕开查找字典的需要。) – capitalistcuttle

+0

@capitalistcuttle最后一位(“一般情况下”)是针对未排序的字典。 –

+0

啊,对。还没有得到我的头:)。我看到它避免了排序字典并使用unique()的排序输出。大!顺便说一句,第二位的第二行有一个额外的右方括号。并且描述“back”间接性的几行会有帮助。 – capitalistcuttle

相关问题