#python #arrays #numpy #return
Вопрос:
Я создаю функцию, которая принимает два списка и кортеж в качестве данных и возвращает данные, отсортированные в порядке возрастания по индексам первых списков (это не очень важно для моего вопроса, но контекст.) Вот что у меня есть:
def sort_data(data): """ (tuple) -gt; tuple data is a tuple of two lists. Returns a copy of the input tuple sorted in non-decreasing order with respect to the data[0] gt;gt;gt; sort_data(([5, 1, 7], [1, 2, 3])) ([1, 5, 7], [2, 1, 3]) gt;gt;gt; sort_data(([2, 4, 8], [1, 2, 3])) ([2, 4, 8], [1, 2, 3]) gt;gt;gt; sort_data( ([11, 4, -5], [1, 2, 3])) ([-5, 4, 11], [3, 2, 1]) """ ([a,b,c],[d,e,f]) = data x = [a,b,c] y = [d,e,f] xarray = np.array(x) yarray = np.array(y) x1 = np.argsort(xarray) xsort = (xarray[x1]) ysort = (yarray[x1]) #remove array() return ([xsort],[ysort])
Это отлично работает, но возвращает очень немного неправильно. Например, я бы хотел, чтобы это было видно в моей строке документа:
gt;gt;gt; sort_data(([5, 1, 7], [1, 2, 3])) ([1, 5, 7], [2, 1, 3])
но вместо этого я получил это:
([array([1, 5, 7])], [array([2, 1, 3])])
Как я мог удалить массив (), чтобы в качестве возвращаемого значения у меня были только два списка в кортеже? Я попытался преобразовать его в кортеж, но тогда это два кортежа, когда мне нужен только один.
Комментарии:
1. Попробуй
return (xsort.tolist(), ysort.tolist())
2. @Джеймс, это сработало, спасибо!!
3. Почему тебя это должно волновать? Вы путаете ПРЕДСТАВЛЕНИЕ данных с их СОДЕРЖАНИЕМ. Данные одинаково полезны в обоих случаях, просто они напечатаны по-разному, и вполне вероятно, что люди, использующие вашу процедуру, в любом случае захотят использовать их в виде массива numpy.
4. И вам вообще не нужны переменные a,b,c,d,e,f. Просто сделай
xarray = np.array(data[0])
/yarray = np.array(data[1])
.
Ответ №1:
In [78]: data = ([5, 1, 7], [1, 2, 3])
Поскольку вы используете argsort
, вы можете сортировать обе строки вместе:
Создайте массив из списка:
In [79]: arr = np.array(data) In [80]: arr Out[80]: array([[5, 1, 7], [1, 2, 3]])
индекс сортировки:
In [81]: idx = np.argsort(arr[0]) In [82]: idx Out[82]: array([1, 0, 2])
примените его к столбцам:
In [83]: arr[:,idx] Out[83]: array([[1, 5, 7], [2, 1, 3]])
сделайте этот массив списком:
In [84]: arr[:,idx].tolist() Out[84]: [[1, 5, 7], [2, 1, 3]]
Поскольку вам дан кортеж списков, должен быть способ выполнить эту сортировку с помощью Python sorted
и его key
. Но я использовал это не так часто, как numpy.
Я не знаю, лучше это или нет:
In [11]: data = ([5, 1, 7], [1, 2, 3])
отсортируйте первый список, записав также индекс:
In [12]: x=sorted([(v,i) for i,v in enumerate(data[0])], key=lambda x:x[0]) In [13]: x Out[13]: [(1, 1), (5, 0), (7, 2)]
извлеките этот индекс:
In [14]: idx = [i[1] for i in x] In [15]: idx Out[15]: [1, 0, 2]
используйте это для возврата обоих подсписков:
In [16]: [[d[i] for i in idx] for d in data] Out[16]: [[1, 5, 7], [2, 1, 3]]