Как перевернуть половину массива numpy

#python #numpy #flip

#python #numpy #перевернуть

Вопрос:

У меня есть массив numpy:

 arr=np.array([[1., 2., 0.],
               [2., 4., 1.],
               [1., 3., 2.],
               [-1., -2., 4.],
               [-1., -2., 5.],
               [1., 2., 6.]])
 

Я хочу перевернуть вторую половину этого массива вверх. Я имею в виду, что я хочу иметь:

 flipped_arr=np.array([[-1., -2., 4.],
                      [-1., -2., 5.],
                      [1., 2., 6.],
                      [1., 2., 0.],
                      [2., 4., 1.],
                      [1., 3., 2.]])
 

Когда я пытаюсь использовать этот код:

 fliped_arr=np.flip(arr, 0)
 

Это дает мне:

 fliped_arr= array([[1., 2., 6.],
                   [-1., -2., 5.],
                   [-1., -2., 4.],
                   [1., 3., 2.],
                   [2., 4., 1.],
                   [1., 2., 0.]])
 

Заранее я ценю любую помощь.

Комментарии:

1. Каково ожидаемое поведение, когда количество строк в массиве нечетное?

2. @Kalpit, спасибо за подсказку. Затем я хочу сказать, что от этой строки до конца, приведите строки с тем же порядком вверх. Тогда эта n-я строка будет первой.

Ответ №1:

Вы можете просто объединить строки ниже строки n th (включенной), например, с помощью np.r_ , с выбранным вами индексом строки n вверху, а остальные — внизу:

 import numpy as np
n = 3

arr_flip_n = np.r_[arr[n:],arr[:n]]

>>> array([[-1., -2.,  4.],
           [-1., -2.,  5.],
           [ 1.,  2.,  6.],
           [ 1.,  2.,  0.],
           [ 2.,  4.,  1.],
           [ 1.,  3.,  2.]])
 

Ответ №2:

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

 ans = np.vstack((arr[int(arr.shape[0]/2):], arr[:int(arr.shape[0]/2)]))
 

чтобы немного разбить это:

найдите среднюю точку arr, найдя его форму, первым индексом которой является количество строк, деление на два и преобразование в целое число:

 midpoint = int(arr.shape[0]/2)
 

затем две половины массива можно нарезать следующим образом:

 a = arr[:midpoint]
b = arr[midpoint:]
 

затем сложите их обратно вместе, используя np.vstack :

 ans = np.vstack((a, b))
 

(обратите внимание, что vstack принимает один аргумент, который представляет собой кортеж, содержащий a и b : (a, b) )

Комментарии:

1. Привет @Finley, чем это отличается от моего ответа?

2. Похоже, это не так. Вашего там не было на момент публикации. (появился после обновления, которое пришло с публикацией asnwer)

Ответ №3:

Вы можете сделать это с помощью нарезки массива и vstack —

 arr=np.array([[1., 2., 0.],
               [2., 4., 1.],
               [1., 3., 2.],
               [-1., -2., 4.],
               [-1., -2., 5.],
               [1., 2., 6.]])

mid = arr.shape[0]//2  
np.vstack([arr[mid:],arr[:mid]])
 
 array([[-1., -2.,  4.],
       [-1., -2.,  5.],
       [ 1.,  2.,  6.],
       [ 1.,  2.,  0.],
       [ 2.,  4.,  1.],
       [ 1.,  3.,  2.]])