У меня есть список, содержащий числа. Я хочу отсортировать один из списков, а затем убедиться, что другие списки расположены в порядке отсортированного списка. Все списки имеют одинаковый размер.
import numpy as np
# Example list of lists with numbers
list_of_lists = [[5, 8, 9], [1, 4, 7], [6, 3, 2]]
# Convert lists to NumPy arrays
arrays = [np.array(lst) for lst in list_of_lists]
# Sort the first array
sorted_array = np.sort(arrays[0])
# Initialize a list to hold the reordered arrays
reordered_arrays = [sorted_array] # Start with the sorted array
# Function to reorder an array based on the sorted positions of its elements
def reorder_array(arr, sorted_positions):
reordered_arr = np.full_like(sorted_array, fill_value=np.nan) # Initialize with NaNs
for pos, val in enumerate(sorted_positions):
if val in arr:
idx = np.where(arr == val)[0][0] # Find the index of the current value in the unsorted array
reordered_arr[pos] = arr[idx] # Place the value from the original array at the correct position
return reordered_arr
# Reorder the other arrays
for arr in arrays[1:]:
sorted_positions = np.argsort(arr) # Find the sorted positions of elements in the current array
reordered_arr = reorder_array(arr, sorted_positions)
reordered_arrays.append(reordered_arr)
print(reordered_arrays)
Подойдет любой подсписок. Просто, как только я отсортирую один из них, остальные должны быть переставлены в том же порядке.
Можете ли вы дать мне ожидаемый результат? Основываясь на вашем вопросе, вот мой упрощенный код:
import numpy as np
# Example list of lists with numbers
list_of_lists = [[5, 8, 9], [1, 4, 7], [6, 3, 2]]
# Convert lists to NumPy arrays
arrays = np.array(list_of_lists)
# Get the indices that would sort the first array
sorted_indices = np.argsort(arrays[2])
# Reorder all arrays based on these sorted indices
reordered_arrays = arrays[:, sorted_indices]
# Convert back to a list of lists if needed
reordered_lists = reordered_arrays.tolist()
print(reordered_lists) # [[9, 8, 5], [7, 4, 1], [2, 3, 6]]
Вы можете изменить np.argsort(arrays[...])
по своему желанию.
Если у вас есть этот массив:
list_of_lists = [[9, 5, 8], [1, 4, 7], [6, 3, 2]]
arr = np.array(list_of_lists)
print(arr)
[[9 5 8]
[1 4 7]
[6 3 2]]
Тогда вы можете сделать:
arr2 = arr[:, np.argsort(arr[0])]
print(arr2)
Распечатки:
[[5 8 9]
[4 7 1]
[3 2 6]]
Вы можете использовать функцию key функции Python sorted, например:
list_of_lists = [[5, 8, 9], [1, 4, 7], [6, 3, 2]]
# Convert lists to NumPy arrays
arrays = np.array(list_of_lists)
# list index to sort on
sortidx = 2
sorted_array = np.array(sorted(arrays.T, key=lambda a: a[sortidx])).T
print(sorted_array)
[[9 8 5]
[7 4 1]
[2 3 6]]
Будете ли вы всегда хотеть сортировать по значениям в первом подсписке со списком (
arrays[0]
) или это может быть любой из подсписков?