2015-01-22 3 views
2

Предположим, что у меня 1D массив длиной 10:нарезка: доступ первые два элемента в обратном порядке работает цикл

A = np.arange(10) 

Я хотел бы получить доступ к элементам 2 в то время, и обратный их. После этого будет выглядеть следующим образом:

np.array([1,0,3,2,5,4,7,6,9,8]) 

Я делаю это для цикла:

for i in range(5): 
    A[2*i:2*i+2] = A[2*i+1:2*i-1:-1] 

Это решение работает для г = 0!. Можно ли получить желаемый результат для ВСЕХ элементов, без специального случая для i?

* Я использовал 1D как раз в качестве примера. Мой фактический массив - это 2D, с координатами y и x в виде строк. cv2.fitEllipse и cv.drawContours требуют массив, где x и y - столбцы ((2, n) -> (n, 1,2)). Я должен изменить форму своего массива и изменить порядок (и я хотел бы сделать это за 1 операцию).

+0

Вы меняете форму на '.reshape (...)' и меняете порядок с помощью '[...: : -1] '. – hpaulj

ответ

1

Вы могли бы сделать что-то вроде этого:

>>> arr = np.arange(10) 
>>> arr.reshape(arr.size/2, 2)[:,::-1].flatten() 
array([1, 0, 3, 2, 5, 4, 7, 6, 9, 8]) 

Для на месте модификации:

>>> arr = np.arange(10) 
>>> arr[::2], arr[1::2] = arr[1::2], arr[::2].copy() 
>>> arr 
array([1, 0, 3, 2, 5, 4, 7, 6, 9, 8]) 

Вызов .copy() требуется, потому что к тому времени, Python достигнет arr[1::2] на LHS элементы в arr[::2] являются уже изменен.

+1

Немного проще: 'arr.reshape (-1, 2)' – hpaulj

+0

@hpaulj Прохладный, не знал этого. –

0

Для вашего фактического использования OpenCV случае следующие работы в одном кадре:

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

     [[6, 1]], 

     [[7, 2]], 

     [[8, 3]], 

     [[9, 4]]]) 
>>> a[::-1, None,:].T.shape 
(5, 1, 2) 

Индексация изменяет порядок столбцов и добавляет дополнительное измерение. И поведение по умолчанию для транспонирования - это изменить порядок размеров, который завершает то, что было после