将一个 NumPy 字符串数组映射为整数。

15

问题:

给定一个字符串数据的数组

dataSet = np.array(['kevin', 'greg', 'george', 'kevin'], dtype='U21'), 

我希望有一个能够返回索引数据集的函数

indexed_dataSet = np.array([0, 1, 2, 0], dtype='int')

以及查找表

lookupTable = np.array(['kevin', 'greg', 'george'], dtype='U21')

使得

(lookupTable[indexed_dataSet] == dataSet).all()

是真的。请注意,indexed_dataSetlookupTable都可以被置换以使上述条件成立,这是可以接受的(即,lookupTable的顺序不必等同于其在dataSet中首次出现的顺序)。

缓慢的解决方案:

我目前有以下缓慢的解决方案:

def indexDataSet(dataSet):
    """Returns the indexed dataSet and a lookup table
       Input:
           dataSet         : A length n numpy array to be indexed
       Output:
           indexed_dataSet : A length n numpy array containing values in {0, len(set(dataSet))-1}
           lookupTable     : A lookup table such that lookupTable[indexed_Dataset] = dataSet"""
    labels = set(dataSet)
    lookupTable = np.empty(len(labels), dtype='U21')
    indexed_dataSet = np.zeros(dataSet.size, dtype='int')
    count = -1
    for label in labels:
        count += 1
        indexed_dataSet[np.where(dataSet == label)] = count
        lookupTable[count] = label

    return indexed_dataSet, lookupTable

有没有更快的方法来做这件事?我感觉我在这里没有充分利用numpy。

2个回答

24
你可以使用 np.unique 函数,并指定 return_inverse 参数:
>>> lookupTable, indexed_dataSet = np.unique(dataSet, return_inverse=True)
>>> lookupTable
array(['george', 'greg', 'kevin'], 
      dtype='<U21')
>>> indexed_dataSet
array([2, 1, 0, 2])

如果您愿意,您可以从这两个数组重构原始数组:

>>> lookupTable[indexed_dataSet]
array(['kevin', 'greg', 'george', 'kevin'], 
      dtype='<U21')

如果您使用pandas,lookupTable,indexed_dataSet = pd.factorize(dataSet)将实现相同的功能(并且对于大型数组可能更有效)。


你改变了我的生活! - undefined

5

np.searchsorted可以解决这个问题:

dataSet = np.array(['kevin', 'greg', 'george', 'kevin'], dtype='U21'), 
lut = np.sort(np.unique(dataSet))  # [u'george', u'greg', u'kevin']
ind = np.searchsorted(lut,dataSet) # array([[2, 1, 0, 2]])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接