python - 将 NumPy 字符串数组映射为整数

标签 python arrays string performance numpy

问题:

给定一个字符串数据数组

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

最佳答案

您可以使用 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) 将实现相同的目的(并且可能对大型数组更有效)。

关于python - 将 NumPy 字符串数组映射为整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36676576/

相关文章:

c# - 从 C# 应用程序运行 .py 时控制台输出空白

javascript - 数组中对象的总和值

c++ - 如何在 SFML 中检查二维 map 上的碰撞?

php - 如何在不更改其键值的情况下删除数组的第一个元素?

c++ - C/C++ 字符串转移到特定元素 - 最少的步骤

python - 如果另一列中的行满足条件则填充 nan

Python 3 获取 HTTP 页面

python - paramiko 中的管道命令

java - 从以 "name:"开头的字符串中获取参数

string - 在 Swift 中检查字符串值