#python #python-3.x #list #numpy #matrix
#python #python-3.x #Список #numpy #матрица
Вопрос:
Чтобы упростить, я перечисляю в пронумерованной форме
1) У меня есть список с именами файлов
2) Я хотел бы извлечь запись из массива numpy, у которой максимальная сумма по строкам выше по сравнению с другими записями (строками)
Пожалуйста, найдите скриншот ниже для справки
Что я сделал, так это создал массив и выяснил сумму, используя функцию np.sum. Однако я не могу найти метод для извлечения строки на основе этого условия суммы. Я хотел бы иметь только конкретную строку и значение суммы, которые могут быть помечены для элемента в списке. Есть ли какая-либо элегантная функция python для этого?
t1 = ['abc_1.png','abc_2.png'] -- list with filenames as elements
arr_1 = np.random.rand(3,3) -- array 1
arr_2 = np.random.rand(3,3) -- array 2
arr1_sum = np.sum(arr_1,axis=1)
arr2_sum = np.sum(arr_2,axis=1) -- the last two statement returns an array. I would like to extract the corresponding row/record which contributes to that sum and tag it to the first and second element in list (abc_1.png)
Ожидаемый результат может быть либо в форме списка, либо в форме словаря. Пожалуйста, посмотрите пример скриншота ниже
Ответ №1:
вы ищете np.argmax:
max_row = arr_2[np.argmax(arr2_sum), :]
output = list(max_row)
output.append(np.max(arr2_sum))
output = {'abc_2.png' : output}
Ответ №2:
Если вы хотите выполнить это итеративно для списка файлов и массивов, вы могли бы:
files = ['abc_1.png','abc_2.png']
arr_1 = np.random.rand(3,3)
arr_2 = np.random.rand(3,3)
arrays = [arr_1, arr_2]
sums = [np.sum(arr, axis=1) for arr in arrays]
output_dict = {}
for i in range(len(files)):
max_index = int(np.where(sums[i] == max(sums[i]))[0])
output_dict[files[i]] = arrays[i][max_index]
И, как сказал @warped, вы могли бы использовать np.argmax(), чтобы отказаться от цикла for:
files = ['abc_1.png','abc_2.png']
arr_1 = np.random.rand(3,3)
arr_2 = np.random.rand(3,3)
arrays = [arr_1, arr_2]
sums = [np.sum(arr, axis=1) for arr in arrays]
output_dict = {files[i]: list(arrays[i][np.argmax(sums[i]), :]) for i in range(len(files))}