小编典典

如何将数组分成几个部分?

all

我有一个长度约为 12000 的数组,类似于array([0.3, 0.6, 0.3, 0.5, 0.1, 0.9, 0.4...]). 此外,我在数据框中有一列提供了类似的值2,3,7,3,2,7...。列的长度是 48,这些值的总和是 36。

我想分配值,这意味着 12000 长度的数组由特定的每个值分配。例如,该列中的第一个值 (= 2) 得到它自己的数组12000*(2/36)(可能是 [0.3, 0.6, 0.3]),第二个值 (= 3) 得到它的数组12000*(3/36),并且它的值在第一个值之后继续(类似于 [0.5, 0.1, 0.9, 0.4])等等。


阅读 64

收藏
2022-08-07

共1个答案

小编典典

import pandas as pd
import numpy as np


# mock some data
a = np.random.random(12000)
df = pd.DataFrame({'col': np.random.randint(1, 5, 48)})

indices = (len(a) * df.col.to_numpy() / sum(df.col)).cumsum()
indices = np.concatenate(([0], indices)).round().astype(int)
res = []
for s, e in zip(indices[:-1], indices[1:]):
    res.append(a[round(s):round(e)])

# some tests
target_pcts = df.col.to_numpy() / sum(df.col)
realized_pcts = np.array([len(sl) / len(a) for sl in res])
diffs = target_pcts / realized_pcts
assert 0.99 < np.min(diffs) and np.max(diffs) < 1.01
assert all(np.concatenate([*res]) == a)
2022-08-07