【问题标题】:Find Maximum abs. value for each group of row index, Arrange max. values diagonally in matrix, non diagonal values as per indexes,find determinant找到最大腹肌。每组行索引的值,排列最大值。矩阵中的对角线值,根据索引的非对角线值,找到行列式
【发布时间】:2019-10-11 07:30:31
【问题描述】:

我是 Python 新手。

我想从同一行索引组的所有列中找到最大值(即 5 到 130,以 5 开头),并在输出中显示其行和列索引标签。最大值可以是正数也可以是负数(+ 或 -)

不同组中的行索引不应重复。即一组的一个行索引。

P.S.- 如果两个组有最大值。同一行索引中的值,然后考虑不同行索引的下一个最大值。

从每个组中找到最大的值后,将这些值沿对角线排列在方阵中。然后用主数据帧中每个组的列索引的相应值填充剩余的非对角线值,并找到它的行列式。

我的数据框:

df=pd.DataFrame(
    {'0_deg': [2, 11, 21, -17, 5, 40, 22, 7, 20, -6, -6, -6, 24, 21, 20, 61, 21, 5, 2, 17], 
     '10_deg': [12, -21, 11, 1, 4, -2, 33, 53, 18, 10, -3, -1, 23, 18, 23, 8, 11, -25, 21, -14], 
     '20_deg': [23, -10, 3, 20, -41, 13, 10, 5, -9, 7, -4, -21, 14, -26, -31, 9, 1, -15, 3, -6], 
     '30_deg': [12, 9, -5, 4, 9, -46, 1, -8, -27, 3, -9, -14, 15, -6, 14, 7, -11, 5, 19, -4]}, index=[5, 10, 12, 101, 130, 5, 10, 12, 101, 130, 5, 10, 12, 101, 130, 5, 10, 12, 101, 130])

新数据框:浮点值而不是整数

data_dict ={'0_deg': [3.30E-05, 2.34E-05, 1.59E-05, 1.08E-06, 1.93E-05, 2.30E-06, -9.20E-05, 5.20E-05, 1.90E-06, 2.12E-05, 2.02E-05, 1.62E-05, -8.20E-05, 1.60E-06, 1.44E-05, 1.62E-05, 8.85E-07, -2.45E-05, -4.05E-06, -1.92E-05], 
   '10_deg': [1.23E-05, -2.11E-05, -2.03E-06, 5.04E-06, 7.87E-06, 4.51E-06, 9.41E-06, -1.04E-05, -1.85E-05, -6.19E-06, 1.19E-05, 2.01E-05, 4.30E-06, 3.66E-06, 5.21E-06, -3.32E-06, 4.02E-06, 2.00E-05, 8.73E-07, 2.41E-05], 
   '20_deg': [7.10E-06, 1.63E-05, 4.12E-05, -6.37E-06, 1.52E-06, 9.65E-06, 4.14E-06, -4.51E-05, -1.82E-05, -7.86E-05, 7.16E-05, 7.00E-05, 6.70E-06, 4.54E-07, 5.55E-07, 6.45E-06, 5.69E-06, 1.00E-05, -5.65E-06, 3.00E-05], 
   '30_deg': [-3.20E-06, 3.54E-05, 6.21E-05, 5.10E-07, -1.20E-05, 1.14E-05, 4.19E-05, -1.23E-05, -9.11E-05, 4.20E-05, -1.52E-05, -1.00E-06, 2.06E-06, 3.33E-06, 2.30E-06, 1.41E-05, 3.62E-05, 3.90E-05, -1.56E-05, 4.00E-06],
  }

带有浮点值的输出,错误如下:

在代码中,只有数据类型被更改为浮点数 dtype=np.float32

这给了我预期输出 1:

但是为了填充矩阵并找出行列式,它显示以下错误。此外,如果我尝试再添加一个从 4 到 5 的组,或者如果我再添加 1 个列索引,我会收到 相同的错误。我想为 15 个组实现代码,每个组有 100 个索引。

while idx[idx_angle_number[0][0]] in repeating_row_idx:
IndexError: index 0 is out of bounds for axis 0 with size 0

实际输出:

在我的实际输出中,索引 130 重复 2 组,在这种情况下,请考虑另一个索引的下一个更高值。

预期输出 1:

预期输出 2:

预期输出 3:

我试过的代码:

df = pd.read_csv ('Matrixfile.csv')
df = df.set_index('Index')

def f(x):
    x1 = x.abs().stack()
    x2 = x.stack()
    x = x2.iloc[np.argsort(-x1)].head(1)
    return x

groups = (df.index == 5).cumsum()
df1 = df.groupby(groups).apply(f).reset_index(level=[1,2])
df1.columns = ['Index','Angle','Value']

print (df1)
df1.to_csv('Matrix_OP.csv', encoding='utf-8', index=True)

我尝试的另一个代码:

import numpy as np

# INPUT
data_dict ={'0_deg': [43, 50, 45, -17, 5, 19, 11, 32, 36, 41, 19, 11, 32, 36, 1, 19, 7, 1, 36, 10], 
   '10_deg': [47, 41, 46, -18, 4, 16, 12, 34, -52, 31, 16, 12, 34, -71, 2, 9, 52, 34, -6, 9], 
   '20_deg': [46, 43, -56, 29, 6, 14, 13, 33, 43, 6, 14, 13, 37, 43, 3, 14, 13, 25, 40, 8], 
   '30_deg': [-46, 16, -40, -11, 9, 15, 33, -39, -22, 21, 15, 63, -39, -22, 4, 6, 25, -39, -22, 7],
   }

# Row idx of a group in this list
idx = [5, 10, 12, 101, 130]


# Getting some dimensions and sorting the data
row_idx_length = len(idx) 
group_length = len(data_dict['0_deg'])
number_of_groups = len(data_dict.keys())  
idx = idx*number_of_groups   
data_arr = np.zeros((group_length,number_of_groups),dtype=np.int32) 
#
col = 0
keys = []
for key in sorted(data_dict):
    data_arr[:,col] = data_dict[key]
    keys.append(key)
    col+=1

def get_max_value_group(arr):
    # function to find maximum absolute value of a 2d array
    max_values = []
    for i in range(0, len(arr)):
        max_value = max(abs(arr[i]))
        max_values.append(max_value)
    return max(max_values) 

# For output 1
max_values = []  
for i in range(0,row_idx_length*number_of_groups,row_idx_length):
    # get the max value for the current group
    value = get_max_value_group(data_arr[i:i+row_idx_length])
    # get the row and column idx associated with the max value
    idx_angle_number = np.nonzero(abs(data_arr[i:i+row_idx_length,:])==value)
    print('Group number : ' + str(i//row_idx_length+1))
    print('Number : '+ str(idx[idx_angle_number[0][0]]))
    print('Angle : '+ keys[idx_angle_number[1][0]])
    print('Absolute value : ' + str(value))   
    print('------')
    max_values.append(value)

# Arrange those values diagonally in square matrix for output 2
A = np.diag(max_values)   
print('A = ' + str(A))

# Fill A with desired values
for i in range(0,number_of_groups,1):
    A[i,0] = data_arr[i*row_idx_length+2,2]   # 20 deg 12
    A[i,1:3] = data_arr[i*row_idx_length+3,1] # x2 : 10 deg 101
    A[i,3] = data_arr[i*row_idx_length+1,1]   # 10 deg 10

# Final output
# replace the diagonal of A with max values
# get the idx of diag
A_di = np.diag_indices(number_of_groups)
# replace with max values
A[A_di] = max_values
print ('A = ' + str(A)) 

# Compute determinant of A
det_A = np.linalg.det(A)
print ('det(A) = '+str(det_A))

请求社区的支持。

【问题讨论】:

    标签: python pandas numpy matrix max


    【解决方案1】:

    我添加以下修改:

    *函数求绝对极值而不是max(abs())。

    *在搜索过程中,我添加了一个测试以避免idx重复。

    *最终输出的 A 填充现在基于输出 1 的结果

    import numpy as np
    
    # INPUT
    data_dict ={'0_deg': [2, 11, 21, -17, 5, 40, 22, 7, 20, -6, -6, -6, 24,     21, 20, 61, 21, 5, 2, 17], 
     '10_deg': [12, -21, 11, 1, 4, -2, 33, 53, 18, 10, -3, -1, 23, 18, 23, 8, 11, -25, 21, -14], 
     '20_deg': [23, -10, 3, 20, -41, 13, 10, 5, -9, 7, -4, -21, 14, -26, -31, 9, 1, -15, 3, -6], 
     '30_deg': [12, 9, -5, 4, 9, -46, 1, -8, -27, 3, -9, -14, 15, -6, 14, 7, -11, 5, 19, -4]}
    
    # row idx of a group in this list
    idx = [5, 10, 12, 101, 130]
    
    
    # getting some dimensions and sorting the data
    row_idx_length = len(idx) 
    group_length = len(data_dict['0_deg'])
    number_of_groups = len(data_dict.keys())  
    idx = idx*number_of_groups   
    data_arr = np.zeros((group_length,number_of_groups),dtype=np.int32) 
    #
    col = 0
    keys = []
    for key in sorted(data_dict):
        data_arr[:,col] = data_dict[key]
        keys.append(key)
        col+=1 
    # just a similar array for repeatition test    
    data_arr_repeat = np.copy(data_arr)
    
    def get_extrema_value_group(arr):
        # function to find absolute extrema value of a 2d array
        extrema = 0
        for i in range(0, len(arr)):
            max_value = max(arr[i])
            min_value = min(arr[i])
            if (abs(min_value) > max_value) and (abs(extrema) < abs(min_value)):
                extrema = min_value
            elif (abs(min_value) < max_value) and (abs(extrema) < max_value):
                extrema = max_value         
        return extrema 
    
    # for output 1
    max_values = []  
    # for repeatition and A filling
    sorted_number = []
    sorted_angle = []
    for i in range(0,row_idx_length*number_of_groups,row_idx_length):
        # get the max value for the current group
        value = get_extrema_value_group(data_arr[i:i+row_idx_length])
        # get the row and column idx associated with the max value
        idx_angle_number = np.nonzero(data_arr[i:i+row_idx_length,:]==value)
        #
        # test for repetition
        while idx[idx_angle_number[0][0]] in sorted_number:
            print('>> Extrema '+str(value)+' got repeating idx ' + str(idx[idx_angle_number[0][0]]) + ' : next higher value of another index will be considered')
            # set data_arr repeating value to 0 to exclude it
            data_arr_repeat[i+idx_angle_number[0][0],idx_angle_number[1][0]] = 0
            # get the NEW max value for the current group
            value = get_extrema_value_group(data_arr_repeat[i:i+row_idx_length])
            # get the row and column idx associated with the max value
            idx_angle_number = np.nonzero(data_arr_repeat[i:i+row_idx_length,:]==value)    
        #
        print('Group number : ' + str(i//row_idx_length+1))
        print('Number : '+ str(idx[idx_angle_number[0][0]]))
        print('Angle : '+ keys[idx_angle_number[1][0]])
        print('Absolute extrema value : ' + str(value))   
        print('------')
        max_values.append(value)
        sorted_number.append(idx_angle_number[0][0])
        sorted_angle.append(idx_angle_number[1][0])
    
    
    # arrange those values diagonally in square matrix for output 2
    A = np.diag(max_values)   
    print('A = ' + str(A))
    
    # fill A with desired values based on sorted_number and sorted_angle
    for i in range(0,number_of_groups,1):
        for j in range(0,number_of_groups,1):
            A[j,i] = data_arr[j*row_idx_length+sorted_number[i],sorted_angle[i]]
    
    # Final output
    # replace the diagonal of A with max values
    # get the idx of diag
    A_di = np.diag_indices(len(max_values))
    # replace with max values
    A[A_di] = max_values
    print ('A = ' + str(A)) 
    
    # Compute determinant of A
    det_A = np.linalg.det(A)
    print ('det(A) = '+str(det_A))
    

    全局输出:

    Group number : 1
    Number : 130
    Angle : 20_deg
    Absolute extrema value : -41
    ------
    Group number : 2
    Number : 12
    Angle : 10_deg
    Absolute extrema value : 53
    ------
    >> Extrema -31 got repeating idx 130 : next higher value of another index will be considered
    Group number : 3
    Number : 101
    Angle : 20_deg
    Absolute extrema value : -26
    ------
    Group number : 4
    Number : 5
    Angle : 0_deg
    Absolute extrema value : 61
    ------
    A = [[-41   0   0   0]
         [  0  53   0   0]
         [  0   0 -26   0]
         [  0   0   0  61]]
    A = [[-41  11  20   2]
         [  7  53  -9  40]
         [-31  23 -26  -6]
         [ -6 -25   3  61]]
    det(A) = 7265430.000000008
    

    【讨论】:

    • 例如。第 1 组的 A11 对角线值为-41,位于索引13020_deg。所以我的 A21 应该与第 2 组的 130,20_deg 值相同,即7,A31 应该是第 3 组的13020_deg,即-31..等等。如果你下一步,我的 A22 对角线值为第 2 组的12,10_deg,即53.. 所以 A12 将是第 1 组的12,10_deg..即11,A23 为@第 3 组的 987654338@,10_deg23..等等..
    • 您为我的问题提供了极大的支持,请您帮忙进行 1 分钟的编辑。在#filling Matrix A with desired values 部分代码中,值已手动输入。 ``` A[i,0] = data_arr[i*row_idx_length+4,2]``` 这里,+4,2 是手动输入的,但是对于一个 15x15 的矩阵,手动填充每个位置并不是一件容易的事。那么你能帮我解决这个问题吗,用索引或其他方式填充非对角线值
    • 刚刚编辑,现在告诉我它是否适用于更大的矩阵。
    • 如果我有 5 个组、5 个列或 6 个组和 6 个列,它可以工作,但是如果我添加另一列,我会收到错误:while idx[idx_angle_number[0][0]] in repeating_row_idx: IndexError: index 0 is out of bounds for axis 0 with size 0
    • 我在完整的 15 组矩阵上尝试了代码,我只得到 Output 1 之后我得到上述索引错误,你能建议一些修改吗你的代码???
    【解决方案2】:

    试试:

    # groups of rows
    g = df.groupby(df.index.to_series().eq(5).cumsum())
    
    r_list = []
    cols = []
    for i, v in g:
        r,c = v.drop(r_list).abs().stack().idxmax()
        r_list.append(r)
        cols.append(df.loc[r,c].values)
    
    np.array(cols)
    

    输出:

    array([[-41,   7, -31,  -6],
           [ 11,  53,  23, -25],
           [ 20,  -9, -26,   3],
           [  2,  40,  -6,  61]], dtype=int64)
    

    和行列式:

    np.linalg.det(cols)
    # 7265430.000000008
    

    【讨论】:

      猜你喜欢
      • 2019-10-10
      • 2019-10-27
      • 2020-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-09
      • 1970-01-01
      • 2022-01-23
      相关资源
      最近更新 更多