rwo*_*lst 11 python arrays string performance numpy
问题:
给定一个字符串数据数组
dataSet = np.array(['kevin', 'greg', 'george', 'kevin'], dtype='U21'),
Run Code Online (Sandbox Code Playgroud)
我想要一个返回索引数据集的函数
indexed_dataSet = np.array([0, 1, 2, 0], dtype='int')
Run Code Online (Sandbox Code Playgroud)
和查找表
lookupTable = np.array(['kevin', 'greg', 'george'], dtype='U21')
Run Code Online (Sandbox Code Playgroud)
这样的
(lookupTable[indexed_dataSet] == dataSet).all()
Run Code Online (Sandbox Code Playgroud)
是真的.注意,indexed_dataSet并且lookupTable都可以被置换,使得上述成立并且很好(即,顺序不必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
Run Code Online (Sandbox Code Playgroud)
有更快的方法吗?我觉得我并没有在这里充分利用numpy.
Ale*_*ley 15
您可以使用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])
Run Code Online (Sandbox Code Playgroud)
如果您愿意,可以从这两个数组重建原始数组:
>>> lookupTable[indexed_dataSet]
array(['kevin', 'greg', 'george', 'kevin'],
dtype='<U21')
Run Code Online (Sandbox Code Playgroud)
如果您使用pandas,lookupTable, indexed_dataSet = pd.factorize(dataSet)将实现相同的功能(并且可能对大型数组更有效).
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]])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4266 次 |
| 最近记录: |