gpt4 book ai didi

python - 使用给定值创建给定长度的列表 - 将直方图转换为值列表

转载 作者:太空宇宙 更新时间:2023-11-04 03:04:53 24 4
gpt4 key购买 nike

我有一个直方图,我需要将其转换为我正在使用的另一个软件的单个实例列表:如果我有四个命中值“1”和三个命中值“2”,那么我的列表需要读取 [1,1,1,1,2,2,2]

我的直方图的结构是两个 numpy 数组,打包到一个名为 hist 的列表中。 hist[1] 中的数组存储我的 bin 边缘,hist[0] 中的数组存储每个 bin 的计数。

实现这种转换的一种非常粗略的方法是简单地运行以下代码:

inhist=[]
for i in range(len(hist[0])):
for j in xrange(int(hist[0][i])):
inhist.append(int(hist[1][i]))

有更好的方法吗?特别是当直方图变得非常大时,这可能不再是实现此目标的最有效方法。看到我确切地知道我想要某个值多少次,我想知道我是否可以避免所有循环?

我意识到做这整件事通常会占用 RAM,而且效率不是很高,但是,唉,目前我别无选择。

编辑:print hist 返回:

[array([  0.00000000e+00,   1.83413630e+07,   1.74493106e+09,
7.91390628e+10, 4.54474023e+11, 5.38810039e+11,
3.01718080e+11, 1.38440761e+11, 6.17865624e+10,
2.77457730e+10, 1.32412328e+10, 6.71579967e+09,
3.35556066e+09, 2.00513046e+09, 1.18435261e+09,
7.34440685e+08, 5.13846805e+08, 3.97894623e+08,
1.97770421e+08, 1.11546165e+08, 6.63624300e+07,
3.93196820e+07, 2.81038760e+07, 1.87733930e+07,
1.57307950e+07, 1.55162030e+07, 1.38710060e+07,
3.52969100e+06, 2.32881000e+05, 5.32210000e+04,
1.59100000e+04, 4.89700000e+03, 1.61300000e+03,
6.54000000e+02, 2.63000000e+02, 1.08000000e+02,
3.10000000e+01, 8.00000000e+00, 4.00000000e+00,
2.00000000e+00]),
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
34, 35, 36, 37, 38, 39, 40], dtype=uint64)]

最佳答案

那些 i 索引基本上是元素的范围,范围为 hist[0] 元素的长度,由第一个数组 hist 中存在的数字重复[0] 本身。使用这些我们只需索引到第二个数组 hist[1] 即可为我们提供所需的输出。对于 repeat 部分,我们可以使用 np.repeat .

所以,我们会有一个实现,就像这样 -

inhist = hist[1][np.arange(len(hist[0])).repeat(hist[0])]

作为避免从 NumPy 数组附加元素的矢量化解决方案,这应该非常有效。

此外,如果我们使用 NumPy float 数组,我们可能需要转换为 int dtype。因此,输入 hist[0].astype(int) 并且如果输出也需要作为 int dtype,请对其使用相同的转换,就像这样 -

inhist = hist[1][np.arange(len(hist[0])).repeat(hist[0].astype(int))]

关于python - 使用给定值创建给定长度的列表 - 将直方图转换为值列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39791535/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com