假设我有一个长度为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次操作中执行此操作)。
答案 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)
索引会反转列的顺序并添加额外的维度。转置的默认行为是颠倒维度的顺序,这样就完成了
之后的内容