>>> {i:np.where(x == i)[0] for i in set(x)}
{1: array([0, 5, 6]),
2: array([1, 2]),
4: array([3]),
7: array([4, 7]),
16: array([8])}
字符串 将其与通过列表的更普通的循环进行比较,对于较大的数组,这将显着更快:
def list_method(x):
res = {i:[] for i in set(x)}
for i, value in enumerate(x):
res[value].append(i)
return res
def np_method(x):
return {i:np.where(x == i)[0] for i in set(x)}
x = np.random.randint(1, 50, 1000000)
In [5]: %timeit list_method(x)
259 ms ± 4.03 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [6]: %timeit np_method(x)
120 ms ± 4.15 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
x = [1,2,2,4,7,1,1,7,16]
numlist = []
numdict = {}
c = 0
for n in x:
if n not in numlist:
numlist.append(n)
numdict[n] = [c]
else:
numdict[n].append(c)
c += 1
print(numlist, numdict)
4条答案
按热度按时间zpf6vheq1#
既然你提到你对你的值的数据结构不挑剔,t要得到像你在问题中发布的字典一样的东西,你可以对
x
中的唯一值进行字典理解,其中np.where
是值:字符串
将其与通过列表的更普通的循环进行比较,对于较大的数组,这将显着更快:
型
bmp9r5qi2#
python会是这样的:
字符串
ycggw6v23#
字符串
输出为:
[1, 2, 4, 7, 16] {1: [0, 5, 6], 2: [1, 2], 4: [3], 7: [4, 7], 16: [8]}
写入文件用途:型
nfs0ujit4#
最快的方法是使用defaultdict(纯Python,O(n))
字符串