Python numpy递增地用整数替换元素组

Python numpy递增地用整数替换元素组,python,numpy,Python,Numpy,我需要用这样递增的整数替换每组字符串 import numpy as np data = np.array(['b','b','b','a','a','a','a','c','c','d','d','d']) 我在寻找一个简单的解决方案 使用此数据集 编辑:这并不总是有效: import numpy as np f = open('test.txt','r') lines = np.array([ line.strip() for line in f.readlines() ]) lines

我需要用这样递增的整数替换每组字符串

import numpy as np
data = np.array(['b','b','b','a','a','a','a','c','c','d','d','d'])
我在寻找一个简单的解决方案


使用此数据集


编辑:这并不总是有效:

import numpy as np
f = open('test.txt','r')
lines = np.array([ line.strip() for line in f.readlines() ])
lines100 = lines[0:100]
_, ind, inv = np.unique(lines100, return_index=True, return_inverse=True)
print ind
print inv
nums = np.argsort(ind)[inv]
print nums

[ 0 83 62 40 19]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 2 2 2 2
 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3
 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4]

lines200 = lines[0:200]
_, ind, inv = np.unique(lines200, return_index=True, return_inverse=True)
print ind
print inv
nums = np.argsort(ind)[inv]
print nums
[167   0  83 124 104 144 185  62  40  19]
[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
 9 9 9 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 7 7 7 7 7 7 7
 7 7 7 7 7 7 7 7 7 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4 4 4 4 4 4 4
 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 5 5 5 5
 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6]
[9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6
 6 6 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 5 5 5 5 5 5 5 5 5 5 5
 5 5 5 5 5 5 5 5 5 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 2 2 2 2 2 2 2
 2 2 2 2 2 2 2 2 2 2 2 2 2 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 4 4 4 4
 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3]

但这确实有效:

>>> a,b,c = np.unique(data, return_index=True, return_inverse=True)
>>> c # almost!!!
array([1, 1, 1, 0, 0, 0, 0, 2, 2, 3, 3, 3])
>>> np.argsort(b)[c]
array([0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3], dtype=int64)
并且比字典替换法更快,对于较大的数据集,大约为33%:

def replace_groups(data):
    a,b,c, = np.unique(data, True, True)
    _, ret = np.unique(b[c], False, True)
    return ret

鉴于@DSM注意到我最初的想法不太可行,我能想到的最佳解决方案是更换字典:

def replace_groups_dict(data):
    _, ind = np.unique(data, return_index=True)
    unqs = data[np.sort(ind)]
    data_id = dict(zip(unqs, np.arange(data.size)))
    num = np.array([data_id[datum] for datum in data])
    return num

In [7]: %timeit replace_groups_dict(lines100)
10000 loops, best of 3: 68.8 us per loop

In [8]: %timeit replace_groups_dict(lines200)
10000 loops, best of 3: 106 us per loop

In [9]: %timeit replace_groups_dict(lines)
10 loops, best of 3: 32.1 ms per loop

In [10]: %timeit replace_groups(lines100)
10000 loops, best of 3: 67.1 us per loop

In [11]: %timeit replace_groups(lines200)
10000 loops, best of 3: 78.4 us per loop

In [12]: %timeit replace_groups(lines)
10 loops, best of 3: 23.1 ms per loop
月份数据:

data = np.array(['b','b','b','a','a','a','a','c','c','d','d','d'])
_, ind = np.unique(data, return_index=True)
unqs = data[np.sort(ind)]
data_id = dict(zip(unqs, np.arange(data.size)))
num = np.array([data_id[datum] for datum in data])

如果你还有我上次的测试数据,你能核对一下吗?我相信np.argsort中还有另外一个bug。几个月来?我修好了程序错误,因为我现在不能升级,所以正确地返回月份。这似乎与那无关不,我也没有得到正确的结果。。。仔细研究,但我的编辑有一个解决方法,它确实有效,但可能很慢。如果这种方法有效,那么就不应该
a,b,c=np.unique([3,1,2],True,True);打印np.argsort(b)[c]
give
[0,1,2]
?但似乎不适用于
data=np.array([3,1,2])
(请参阅@DSM对我的回答的评论)@askewchan奇怪的是,我仍然不完全理解为什么我们两人的想法有时有效,但有时无效。。。看起来要快一点,第二次调用
np.unique
而不是你的字典,请看我的编辑。我喜欢这两种解决方案。我接受这一点,因为这是纯粹的numpy和更快一点。然而,我并不完全理解它。你能写一个简短的解释吗?@siamii基本上是我们最初一致的想法,假设
np.unique
返回值没有重新排列(就像你之前的问题一样)。因此,您必须分两步进行:首先,使unique未被安排,然后像我们之前尝试的那样替换它们。@Jaime我认为它失败了,因为对
np.unique
的每次调用都不会保留数组的原始顺序,如:和
data = np.array(['b','b','b','a','a','a','a','c','c','d','d','d'])
_, ind = np.unique(data, return_index=True)
unqs = data[np.sort(ind)]
data_id = dict(zip(unqs, np.arange(data.size)))
num = np.array([data_id[datum] for datum in data])
In [5]: f = open('test.txt','r')

In [6]: data = np.array([line.strip() for line in f.readlines()])

In [7]: _, ind, inv  = np.unique(data, return_index=True)

In [8]: months = data[np.sort(ind)]

In [9]: month_id = dict(zip(months, np.arange(months.size)))

In [10]: np.array([month_id[datum] for datum in data])
Out[10]: array([ 0,  0,  0, ..., 41, 41, 41])