从返回中移除array()



我正在创建一个函数,它接受两个列表和一个元组作为数据,并返回相对于第一个列表索引按递增顺序排序的数据(这对我的问题不是很重要,而是上下文)。以下是我的文件:

def sort_data(data):

""" (tuple) -> 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]

>>> sort_data(([5, 1, 7], [1, 2, 3]))
([1, 5, 7], [2, 1, 3])
>>> sort_data(([2, 4, 8], [1, 2, 3]))
([2, 4, 8], [1, 2, 3])
>>> 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])

这工作得很好,但返回非常轻微的错误。例如,我希望在我的docstring中看到:

>>> sort_data(([5, 1, 7], [1, 2, 3]))
([1, 5, 7], [2, 1, 3])

但是我得到了这个:

([array([1, 5, 7])], [array([2, 1, 3])])

我怎么能删除数组(),这样我就有两个列表在一个元组作为我的返回值?我试图将其转换为元组,但当我只想要一个元组时,它是两个元组。

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

将数组设置为list:

In [84]: arr[:,idx].tolist()
Out[84]: [[1, 5, 7], [2, 1, 3]]

既然给定了一个列表元组,那么应该有一种使用Pythonsorted及其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]]

最新更新