Как выровнять массив numpy в 's' пути? - PullRequest
2 голосов
/ 05 февраля 2020

Учитывая 2D np.array:

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

Как мне распределить его по s-пути так, чтобы я получил

>>> sravel(arr)
array([1, 2, 3, 6, 5, 4, 7, 8, 9])

Additonally, я бы хотел вариант спускаясь также вниз по оси 0, т.е.

>>> sravel(arr, [0,1])
array([1, 4, 7, 8, 5, 2, 3, 6, 9])

, здесь второй аргумент скобок указывает порядок оси.

1 Ответ

3 голосов
/ 05 февраля 2020

Я не думаю, что есть какой-либо прямой способ сделать это, но не трудно получить такой результат:

import numpy as np

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

arr2 = arr.copy()
arr2[1::2] = np.flip(arr[1::2], 1)
print(arr2.ravel())
# [1 2 3 6 5 4 7 8 9]

arr3 = arr.T.copy()
arr3[1::2] = np.flip(arr.T[1::2], 1)
print(arr3.ravel())
# [1 4 7 8 5 2 3 6 9]

РЕДАКТИРОВАТЬ: Как указано scleronomi c, второй случай также может быть выполнен с помощью F-смежного массива:

import numpy as np

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

# The array is copied with F order so ravel does not require another copy later
arr3 = arr.copy(order='F')
arr3[:, 1::2] = np.flip(arr3[:, 1::2], 0)
print(arr3.ravel(order='F'))
# [1 4 7 8 5 2 3 6 9]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...