#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.]])