我有一个二维数组形式的大数据集。 2D数组代表连续的强度数据,我只想这次使用它来创建另一个相同大小的2D数组,这些值被分组为离散值。换句话说,如果我有一个2D数组,
[(11, 23, 33, 12),
(21, 31, 13, 19),
(33, 22, 26, 31)]
输出将如下所示,将10到19的值分配给1,将20到29的值分配给2,将30到39的值分配给3。
[(1, 2, 3, 1),
(2, 3, 1, 1),
(3, 2, 2, 3)]
更理想的是,我想基于百分位数进行这些分配。就像这样,落在前10%的值将被分配为5,将前20%的值分配到4,依此类推。
我的数据集为NumPy格式。我已经看过函数groupby
,但这似乎不允许我指定范围。我也看过cut
,但是cut仅适用于一维数组。当我遍历数据的每一行时,我曾考虑过通过循环运行cut函数,但是我担心这可能会花费太多时间。我的矩阵可能多达4000行乘4000列。
答案 0 :(得分:1)
您需要stack
数据框具有一维表示,然后应用cut
。之后,您可以unstack
。
[tuple(x) for x in (pd.cut(pd.DataFrame(a).stack(), bins=[10,20,30,40], labels=False)+1).unstack().values]
OR (使用@user3483203的魔力)
[tuple(x) for x in np.searchsorted([10, 20, 30, 40], np.array(a))]
输出:
[(1, 2, 3, 1),
(2, 3, 1, 1),
(3, 2, 2, 3)]