Я новичок в Python.
Я хочу найти самые большие значения из всех столбцов для группы одинаковых индексов строк (т. Е. От 5 до 130, начиная с 5), а также показать метку индекса строки и столбца в выходных данных.Наибольшие значения могут быть как положительными, так и отрицательными (+ или -)
Не должно быть дубликатов для индексов строк в разных группах.т.е. один индекс строки для одной группы.
PS- Если две группы имеют макс.значения в тех же индексах строк, а затем рассмотрим следующее наибольшее значение другого индекса строки.
После нахождения наибольшего значения в каждой группе расположите эти значения по диагонали в квадратной матрице.Затем заполните оставшиеся недиагональные значения соответствующими значениями индексов столбцов для каждой группы из основного кадра данных и найдите его определитель.
Мой кадр данных:
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],
}
Вывод значений с плавающей запятой со следующей ошибкой:
В кодетолько тип данных изменяется на float 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))
Запрос поддержки отсообщества.