2015-05-31 1 views
3

У меня очень простой вопрос: Как получить массив numpy из нескольких списков одинаковой длины и отсортировать вдоль оси?Как получить массив numpy из нескольких списков одинаковой длины и отсортировать вдоль оси?

Я ищу что-то вроде:

a = [1,1,2,3,4,5,6] 
b = [10,10,11,09,22,20,20] 
c = [100,100,111,090,220,200,200] 
d = np.asarray(a,b,c) 
print d 
>>>[[1,10,100],[1,10,100],[2,11,111].........[6,20,200]] 

2 Вопрос: А если это может быть достигнуто может я сортировать его вдоль оси (например, для по значениям списка б.)?

3-й вопрос: Может ли сортировка выполняться в диапазоне? например. для значений между b + 10 и b-10 при просмотре списка c для дальнейшей сортировки. как

[[1,11,111][1,10,122][1,09,126][1,11,154][1,11,191] 
[1,20,110][1,25,122][1,21,154][1,21,155][1,21,184]] 
+0

взглянуть на это на ваш второй вопрос: http://stackoverflow.com/questions/2828059/ sorting-arrays-in-numpy-by-column – agrinh

+0

Вы можете использовать d = np.array ([a, b, c]). – tillsten

+0

@tillstenm, как это так же, как запрошенный выход? –

ответ

2

Вы можете сжать, чтобы получить массив:

a = [1, 1, 2, 3, 4, 5, 6] 
b = [10, 10, 11, 9, 22, 20, 20] 
c = [100, 100, 111, 90, 220, 200, 200] 
d = np.asarray(zip(a,b,c)) 
print(d) 
[[ 1 10 100] 
[ 1 10 100] 
[ 2 11 111] 
[ 3 9 90] 
[ 4 22 220] 
[ 5 20 200] 
[ 6 20 200]] 

print(d[np.argsort(d[:, 1])]) # a sorted copy 
[[ 3 9 90] 
[ 1 10 100] 
[ 1 10 100] 
[ 2 11 111] 
[ 5 20 200] 
[ 6 20 200] 
[ 4 22 220]] 

Я не знаю, как вы могли бы сделать На месте, вроде, не делая что-то вроде:

d = np.asarray(zip(a,b,c)) 

d.dtype = [("0", int), ("1", int), ("2", int)] 
d.shape = d.size 
d.sort(order="1") 

Ведущий 0 сделал бы 090 восьмеричным в python2 или недействительным синтаксисом в python3, поэтому я удалил его.

Вы также можете отсортировать заархивированные элементы, прежде чем передать:

from operator import itemgetter 
zipped = sorted(zip(a,b,c),key=itemgetter(1)) 


d = np.asarray(zipped) 
print(d) 
[[ 3 9 90] 
[ 1 10 100] 
[ 1 10 100] 
[ 2 11 111] 
[ 5 20 200] 
[ 6 20 200] 
[ 4 22 220]] 
+0

Спасибо, Padraic за вашу помощь, уверены, что сортировка не может быть сделано в диапазоне, как я спросил в третьем вопросе? –

+0

@ManipalKing, Скорее всего, я просто пытаюсь разгадать логику! Если вы хотите, чтобы на месте, насколько мне известно знание, вам нужен тип записи –

+0

@ ManipalKing, откуда взялись '191, 184,155' и т. Д.? –

1

Вы можете использовать np.dstack и np.lexsort. например, если вы хотите, чтобы отсортировать на основе (второй оси) массив b затем a, а затем c:

>>> d=np.dstack((a,b,c))[0] 
>>> indices=np.lexsort((d[:,1],d[:,0],d[:,2])) 
>>> d[indices] 
array([[ 3, 9, 90], 
     [ 1, 10, 100], 
     [ 1, 10, 100], 
     [ 2, 11, 111], 
     [ 5, 20, 200], 
     [ 6, 20, 200], 
     [ 4, 22, 220]]) 
+0

@PadraicCunningham Почему? его ожидаемый отсортированный результат, основанный на второй оси. – Kasramvd

+0

@PadraicCunningham Да, спасибо за внимание. исправлено – Kasramvd

Смежные вопросы