python - Numpy 数组以索引为值的字典
问题描述
我有一个带有整数值的 numpy 数组,我们称这个数组为 x。
我想创建某种列表,其中对于每个值,我都有 x 的索引来保存这个值。
例如,对于:
x = [1,2,2,4,7,1,1,7,16]
我想得到:
{1: [0,5,6], 2:[1,2], 4:[3], 7:[4,7], 15:[16]}
我使用的括号是任意的,我不在乎我使用哪种数据结构,只要我能尽快将结果输出到文件即可。最后,我想要一个 .txt 文件,内容如下:
0,5,6
1,2
3
4,7
16
解决方案
由于您提到您对值的数据结构并不挑剔,因此要获得类似于您在问题中发布的字典的内容,您可以对值中的唯一值进行字典x
理解np.where
:
>>> {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)
推荐阅读
- c++ - 是否允许在暂停的进程上调用 CreateRemoteThread()?
- python - Python Turtle 如何编程让它自动下降?
- symfony - EasyAdminBundle: how to redirect back to form
- vba - 用 Unicode 代码替换字符的宏仅部分工作
- javascript - 使用 JavaScript 的简单计算器
- nginx - 如何为 modsecurity 规则集执行生成电子邮件警报
- tensorflow - 以可编辑模式安装 tensorflow
- xml - 当有集合/列表和单个元素时在 C# 中反序列化 XML
- unity3d - UNITY - 使用 Raycast 选择对象 - 适用于 Windows,WebGL 错误(触摸屏)
- database - Azure DTU Calculation