сортировка строки массива numpy
Требуется отсортировать только первую строку двумерного массива по возрастанию так, чтобы вторая строка была связана с первой.
Из массива:
a = ([[30, 10, 20],
[ 0, 1, 2]])
на выходе нужно получить:
b = ([[10, 20, 30],
[ 1, 2, 0]])
С помощью np.argsort сортируется каждая строка по возрастанию:
import numpy as np
a = np.array([30,20,10])
b = np.array([0, 1, 2])
a = np.vstack((a, b))
ind = np.argsort(a, axis = 1)
b = np.take_along_axis(a, ind, axis=1)
print(b)
Получается:
[[10 20 30]
[ 0 1 2]]
Нужно, чтобы вторая строка не сортировалась, а была привязана к первой строке.
Ответы (4 шт):
Автор решения: bluesky
→ Ссылка
Разобрался. Нужно найти индексы сортируемой строки и применить их при сортировке к обеим строкам:
import numpy as np
stroka_1 = np.array([30, 10, 20])
stroka_2 = np.array([0, 1, 2])
massiv = np.vstack((stroka_1, stroka_2))
print(massiv)
ind_1 = np.argsort(massiv[0])
stroka_1 = np.take_along_axis(massiv[0], ind_1, axis=0)
stroka_2 = np.take_along_axis(massiv[1], ind_1, axis=0)
massiv = np.vstack((stroka_1, stroka_2))
print(massiv)
Автор решения: strawdog
→ Ссылка
import numpy as np
a = np.array([[30, 10, 20], [ 0, 1, 2]])
исходный:
[[30 10 20]
[ 0 1 2]]
Сортируем:
a = a[:, a[0].argsort()]
Получаем:
[[10 20 30]
[ 1 2 0]]
Автор решения: MZaytsev
→ Ссылка
Сортировку можно сделать с помощью метода sort() и потом заменить 1ю не сортированную строка на сортированную:
import numpy as np
a = ([[30, 10, 20],
[ 0, 1, 2]])
z = np.sort(a[0])
a[0] = z
print(a)
Результат такой как вам нужен.
Автор решения: bluesky
→ Ссылка
Сравнение времени обработки двух способов решения поставленной задачи:
import numpy as np
import time
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import pylab
import statistics
from tkinter import *
import numpy as np
dlina_strok = 10**7
y1 = []
y2 = []
x = []
vremya_1 = []
vremya_2 = []
n = 0
fig = plt.figure()
ax1 = fig.add_subplot(1,1,1)
def animate(i):
global n
global x
global y1
global y2
massiv_1 = np.random.sample((2, dlina_strok))
massiv_2 = massiv_1.copy()
#==================== СПОСОБ № 1 ============================
t1 = time.time()
a = massiv_1[:, massiv_1[0].argsort()]
t1 = time.time() - t1
#============================================================
vremya_1.append(t1)
y1.append(statistics.mean(vremya_1))
n = n + 1
x.append(n)
a = ax1.plot(x, y1, color = 'red', label='a = massiv_1[:, massiv_1[0].argsort()]')
#==================== СПОСОБ № 2 ============================
t2 = time.time()
ind_1 = np.argsort(massiv_2[0])
stroka_1 = np.take_along_axis(massiv_2[0], ind_1, axis=0)
stroka_2 = np.take_along_axis(massiv_2[1], ind_1, axis=0)
b = np.vstack((stroka_1, stroka_2))
t2 = time.time() - t2
#============================================================
vremya_2.append(t2)
y2.append(statistics.mean(vremya_2))
a = ax1.plot(x, y2, color = 'green', label='Способ № 2')
a = ax1.set_ylabel('Время обработки, с')
a = ax1.set_xlim(0, 100)
a = ax1.set_ylim(0, 1)
ani = animation.FuncAnimation(fig, animate, interval = 1)
a = plt.show()