使用Numpy Pandas Python使用索引和迭代来重新格式化值



我想为每个唯一的digit_vals值生成一个代码,逐个遍历vals数组中的列表。digit_vals值显示了预期输出的第n个数字,因此由于digit_vals中的第一个值是24,因此这意味着它之前的所有数字都将用零填充,第24个数字将包含来自vals的值。由于digit_vals中有两个24,这意味着vals的第一个列表([-3.3, -4.3, 23.05, 23.08, 23.88, 3.72](中的第二个索引将包含预期输出中的第24个值,即-4.3vals中第二个列表的第4个索引将包含digit_vals中第27个值的值,依此类推。结果中digit_vals之间的间隙也将用零填充,因此在24和27之间,第25位和第26位将分别有2个零。我该如何对这个函数进行编码,以实现下面的预期输出?

import pandas as pd 
import numpy as np 
digit_vals = np.array([24, 24, 27, 27, 27, 27,
28, 28, 28, 31])
vals = np.array([list([-3.3, -4.3, 23.05, 23.08, 23.88, 3.72]),
list([2.3, 2.05, 3.08, -4.88, 4.72]),
list([5.3, 2.05, 6.08, -13.88, -17.2]),
list([9.05, 6.08, 3.88, -13.72])], dtype=object)

预期输出:

array([  0.         ,   0.        ,   0.        ,   0.        ,
0.        ,   0.        ,   0.        ,   0.        ,
0.        ,   0.        ,   0.        ,   0.        ,
0.        ,   0.        ,   0.        ,   0.        ,
0.        ,   0.        ,   0.        ,   0.        ,
0.        ,   0.        ,   0.        ,   0.        ,
-4.3,      ,   0.        ,   0.        ,  -4.88      ,
6.08,     ,   0         ,   9.05])

首先,如果我正确理解你的问题,那么你的输出数组应该长一个元素,在6.08值和9.05值之间再加一个零,因为9.05应该在索引位置31(其他值与digit_vals中指定的索引位置匹配(。这个问题最难的部分是将digits_vals数组中的信息转换为两个数组,这两个数组正确地索引到每个vals数组列表中,并转换到输出数组中的正确索引位置。因为你已经在使用numpy了,我认为这是一个合理的方法

val_ind = []
out_ind = []
for ind, cnt in enumerate(np.bincount(digit_vals)):
if cnt > 0:
val_ind.append(cnt-1)
out_ind.append(ind)

计算digits_vals中每个值的出现次数,并使用该计数(减去1表示零索引(作为vals数组中每个列表的索引。digits_vals中的每个唯一数字都是通过捕获具有非零计数的每个值的索引来识别的,假设digits_vals将被排序,如问题示例中所述。

一旦构建了索引列表,就可以直接构建输出数组:

out_arr = np.zeros(np.max(digit_vals)+1)
for r_ind, (v_ind, o_ind) in enumerate(zip(val_ind, out_ind)):
out_arr[o_ind] = vals[r_ind][v_ind]

同样,枚举提供了行索引,用于从vals数组中提取正确的行数据。我已经确认这复制了您提供的输出数组,包括上面提到的修复。希望我能正确理解你的问题,并做出合理的假设。如果是这样的话,请更新您的问题,提供更多描述假设等的细节。

相关内容

  • 没有找到相关文章

最新更新