【问题标题】:Map a NumPy array of strings to integers将 NumPy 字符串数组映射到整数
【发布时间】:2016-08-09 03:55:45
【问题描述】:

问题:

给定一个字符串数据数组

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 的潜力。

【问题讨论】:

    标签: python arrays string performance numpy


    【解决方案1】:

    您可以将np.uniquereturn_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) 将实现相同的效果(并且对于大型数组可能更有效)。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-23
        • 2021-11-15
        • 2017-05-19
        • 1970-01-01
        • 2017-01-31
        • 2013-03-20
        相关资源
        最近更新 更多