数组切片:以反向顺序访问前两个元素以运行循环

时间:2015-01-22 12:26:33

标签: python arrays opencv numpy

假设我有一个长度为10的一维数组:

A = np.arange(10)

我想一次访问2个元素并反转它们。之后A看起来像这样:

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

我在for循环中执行此操作:

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

此解决方案适用于i!= 0。是否有可能获得所有元素的所需输出,而没有特殊情况的i?

*我以1D为例。我的实际数组是2D,y和x坐标是行。 cv2.fitEllipse和cv.drawContours需要数组,其中x和y是列((2,n) - >(n,1,2))。我必须改变我的数组的形状并反转顺序(我想在1次操作中执行此操作)。

2 个答案:

答案 0 :(得分: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在LHS上达到arr[1::2]时,arr[::2]处的项目已经被修改。

答案 1 :(得分: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)

索引会反转列的顺序并添加额外的维度。转置的默认行为是颠倒维度的顺序,这样就完成了

之后的内容