удалить массив() из возврата

#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]]