繁体   English   中英

获取格式化 arrays Numpy Python 的最大、最小和最后一个索引

[英]Getting the max, min and last index of formatted arrays Numpy Python

我想为每个唯一的digit_vals值制作一个代码,逐个遍历vals数组中的列表。 digit_vals值显示预期 output 的第 n 个数字,因此由于digit_vals中的第一个值是 24,因此这意味着它之前的所有数字都将用零填充,而第 24 个数字将包含来自vals的值。 由于digit_vals中有两个 24,这意味着第一个vals列表中的第二个索引是最后一个索引,因此需要 ([-3.3, -4.3]) 才能获得最大值:-3.3,最小值:-4.3 和最后一个index: -4.3值( [-3.3, -4.3, 23.05, 23.08, 23.88, 3.72] )将包含预期 Output 中的第 24 个值。 vals中第二个列表的第四个索引将包含digit_vals中第 27 个值的值,依此类推。 digit_vals之间的空白也将在结果中用零填充,因此在 24 和 27 之间,第 25 位和第 26 位将分别有 2 个零。 我想修改out_arr以创建一个具有相同值的二维数组,例如[[zeroes],[zeroes],[zeroes]] maxmin也不起作用max/min(vals[r_ind][v_ind]) 。我怎样才能修复这两个函数?

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)

def Monthly_CAP_movement():
    #Val_ind is used to count the number of repetitive numbers
    #out_ind shows the unique numbers 

    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)

    # Turn the out_arr function to a 2 dimensional of coppied arrays [[zeroes],[zeroes],[zeroes]]
    # Assign 3 of the zeroes one for each (last index, Max and Min)
    out_arr = np.zeros(np.max(digit_vals)+1)
    for r_ind, (v_ind, o_ind) in enumerate(zip(val_ind, out_ind)):
        # Last Index Recording
        out_arr[0][o_ind] = vals[r_ind][v_ind]
        # Max Recording 
        out_arr[1][o_ind] = max(vals[r_ind][v_ind])
        # Min Recording
        out_arr[2][o_ind] = min(vals[r_ind][v_ind])

预期 Output:

Last Index: [ 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.    0.    9.05]
Max Value: [ 0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.
  0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.
 -3.3   0.    0.   3.08   6.08  0.    0.    9.05]
Min Value: [ 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  2.05  0.    0.    9.05]

请查看 numpy 中的列表/数组切片(例如列表切片数组切片)。 首先, out_arr应该用三行初始化。 然后,需要在包含直到v_ind值的所有值的切片上计算最小值和最大值:

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)
out_arr = np.zeros((3, np.max(digit_vals)+1))
for r_ind, (v_ind, o_ind) in enumerate(zip(val_ind, out_ind)):
    out_arr[0, o_ind] = vals[r_ind][v_ind]
    out_arr[1, o_ind] = np.max(vals[r_ind][:v_ind+1])
    out_arr[2, o_ind] = np.min(vals[r_ind][:v_ind+1])

结果输出

切片不返回最后一个值,这就是您需要v_ind+1的原因,如上面的链接中所述。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM