快速将具有索引的numpy数组转换为在该索引上键入的numpy数组的字典

knzhou

我有一组numpy数组。其中之一是“键”列表,我想将数组重新排列成键在该键上的数组的字典。我当前的代码是:

for key, val1, val2 in itertools.izip(keys, vals1, vals2):
    dict1[key].append(val1)
    dict2[key].append(val2)

这很慢,因为涉及的数组长达数百万个条目,而且这种情况发生了很多次。是否可以矢量化形式重写它?可能的密钥集是事先已知的,大约有10个不同的密钥。

编辑:如果有k个不同的键,并且列表长为n,则当前答案为O(nk)(每个键重复一次)和O(n log n)(排在最前面)。不过,我仍在寻找O(n)矢量化解决方案。希望这是可能的;毕竟,最简单的可能的非矢量化事物(即我已经拥有的事物)是O(n)。

比里科

实现此目的的矢量化方法可能会要求您对密钥进行排序。基本思想是对键和值进行排序以匹配。然后,您可以在已排序的键数组中每次有新键时拆分val数组。向量化的代码如下所示:

import numpy as np

keys = np.random.randint(0, 10, size=20)
vals1 = np.random.random(keys.shape)
vals2 = np.random.random(keys.shape)

order = keys.argsort()
keys_sorted = keys[order]

# Find uniq keys and key changes
diff = np.ones(keys_sorted.shape, dtype=bool)
diff[1:] = keys_sorted[1:] != keys_sorted[:-1]
key_change = diff.nonzero()[0]
uniq_keys = keys_sorted[key_change]

vals1_split = np.split(vals1[order], key_change[1:])
dict1 = dict(zip(uniq_keys, vals1_split))

vals2_split = np.split(vals2[order], key_change[1:])
dict2 = dict(zip(uniq_keys, vals2_split))

由于argsort步骤,此方法的复杂度为O(n * log(n))。实际上,除非n非常大,否则argsort会非常快。在argsort明显变慢之前,您可能会用这种方法遇到内存问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将具有已知索引的字典转换为多维数组

来自分类Dev

将具有n级层次结构索引的Pandas DataFrame转换为nD Numpy数组

来自分类Dev

用numpy数组索引字典

来自分类Dev

字典数组的快速索引

来自分类Dev

如何快速将整数添加到数组(具有显式int索引)?

来自分类Dev

如何快速将整数添加到数组(具有显式int索引)?

来自分类Dev

如何快速将作为numpy数组的redis字符串值转换为数据帧?

来自分类Dev

将值转换为NumPy数组中的行索引

来自分类Dev

将值转换为NumPy数组中的行索引

来自分类Dev

如何有效地使用索引数组作为掩码将numpy数组转换为布尔数组?

来自分类Dev

将带有索引的 numpy 数组转换为 Pandas 数据框

来自分类Dev

选择在numpy中具有可变索引范围的数组元素

来自分类Dev

numpy多维数组索引

来自分类Dev

NumPy数组交集的索引

来自分类Dev

圆形numpy数组索引

来自分类Dev

numpy:数组索引

来自分类Dev

提取NumPy数组的索引

来自分类Dev

定义numpy索引数组

来自分类Dev

numpy:数组索引

来自分类Dev

中性numpy数组索引

来自分类Dev

numpy数组更改索引

来自分类Dev

python numpy数组索引

来自分类Dev

更快的 numpy 数组索引

来自分类Dev

没有中间索引数组的从numpy数组中选择的快速方法

来自分类Dev

numpy:按数组索引数组

来自分类Dev

用数组索引Numpy数组

来自分类Dev

用数组索引numpy数组

来自分类Dev

使用索引数组索引多维 numpy 数组

来自分类Dev

将n维numpy数组转换为2维索引数组