2013-09-23 4 views
2

У меня есть 1D-массив, элементы которого перестановка 0:N, и мне нужно взять первые K элементов этой перестановкиПолучить элементы перестановки

Например, в случае перестановки

0 [[9] 
1  [0] 
2  [1] 
3  [2] 
4  [3] 
5  [4] 
6  [5] 
7  [6] 
8  [7] 
9  [8]] 

первые 3 элементы 9, 8, 7

код

n = start 
    r = zeros (nodeCount, dtype = int) 
    i = 0 
    while (self.nodes[n][direction] != stop): 
     r[i] = n 
     n = self.nodes[n][direction] 
     i+=1 

Мне нужен более быстрый способ, чтобы извлечь элементы из перестановки.

ответ

0

numpy.roll что вы после?

>>> a = np.arange(10) 
>>> b = np.roll(a,1) 
>>> b 
array([9, 0, 1, 2, 3, 4, 5, 6, 7, 8]) 
>>> np.roll(b[::-1],1)[:3] 
array([9, 8, 7]) 

Это последняя строка кода является довольно загадочным, но b[::-1] изменяет массив, np.roll сдвиги его, и [:3] принимает только первые три элемента.

+0

нет :). В этом примере, отображаемом там, перестановка была перестановкой идентичности. 9 0 1 2 3 ... 8. Для другой перестановки это не работает. Мне нужен код с той же логикой, что и мой код, но для работы быстрее и для каждой перестановки. – alinsoar

2

Это работает, но я не думаю, что это будет особенно быстро:

>>> a 
array([9, 0, 1, 2, 3, 4, 5, 6, 7, 8]) 
>>> n = 3 
>>> b = np.empty((n,), dtype=a.dtype) 
>>> b[0] = a[0] 
>>> for k in xrange(1, n): 
...  b[k] = a[b[k-1]] 
... 
>>> b 
array([9, 8, 7]) 
+0

спасибо, но это именно то, что я сделал. никаких улучшений;) – alinsoar

+0

Единственное, что меня интересует, это '' speed''. Мой вопрос можно было бы переформулировать так: есть ли функция numpy, которая делает то, что я хочу внутренне в C-коде, поэтому без использования внешних циклов? – alinsoar

+1

Я так не думаю. Тот факт, что ваш следующий элемент основан на значении предыдущего, делает его неотъемлемо рекурсивным. С помощью numpy вы можете иногда пропускать рекурсию, например. используя метод ['accumulate'] ufunc (http://docs.scipy.org/doc/numpy/reference/generated/numpy.ufunc.accumulate.html). Но 'np.take' не является ufunc, и я действительно не понимаю, как это сделать. – Jaime

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