使用索引和迭代通过 Numpy Pandas Python 重新格式化值
Using indexing and iteration to reformat values with 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.3
. vals
中第二个列表的第 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
中每个值的出现次数,并使用该计数(零索引减一)作为 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
数组中提取正确的行数据。我已经确认这会重现您提供的输出数组,包括上面提到的修复。希望我正确理解了你的问题,并做出了合理的假设。如果是这样,请更新您的问题,更详细地描述假设等。
我想编写一个代码,针对每个唯一的 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.3
. vals
中第二个列表的第 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
中每个值的出现次数,并使用该计数(零索引减一)作为 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
数组中提取正确的行数据。我已经确认这会重现您提供的输出数组,包括上面提到的修复。希望我正确理解了你的问题,并做出了合理的假设。如果是这样,请更新您的问题,更详细地描述假设等。