изменить положение массива большего массива в numpy - PullRequest
0 голосов
/ 14 июля 2020

У меня есть массив, подобный матрице, использующий numpy вот так.

import numpy as np

a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16], [17, 18, 19, 20]])

желаемый массив выглядит следующим образом:

array([[ 9, 10, 11, 12],
       [13, 14, 15, 16],
       [17, 18, 19, 20],
       [ 1,  2,  3,  4],
       [ 5,  6,  7,  8],])

описание: первый и второй массивы перемещаются в конец матрицы. Я пробовал что-то с заменой a на list и использовал функции append и del, а затем преобразовал его в numpy array, но это не могло быть что-то хорошее для записи в python. есть ли какая-либо функция для замены позиции массива в более крупной матрице, подобной массиву, в numpy?

Ответы [ 2 ]

3 голосов
/ 14 июля 2020

Функция, которая принимает количество оборотов

In [5]: a
Out[5]:
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12],
       [13, 14, 15, 16],
       [17, 18, 19, 20]])

In [14]: def rotate(n):
...:         n = n%len(a)
...:         return np.concatenate([a[n:], a[:n]])

In [13]: rotate(2)
Out[13]:
array([[ 9, 10, 11, 12],
       [13, 14, 15, 16],
       [17, 18, 19, 20],
       [ 1,  2,  3,  4],
       [ 5,  6,  7,  8]])

Что, если вы дадите n больше, чем длина массива? Он обрабатывается - n = n%len(a)

In [16]: rotate(9)
Out[16]:
array([[17, 18, 19, 20],
       [ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12],
       [13, 14, 15, 16]])

Другое решение, указанное в комментариях, - это метод roll().

In [6]: a
Out[6]:
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12],
       [13, 14, 15, 16],
       [17, 18, 19, 20]])

In [7]: def rotate(n):
   ...:     n = n % len(a)
   ...:     return np.roll(a,-n,axis=0)
   ...:

In [8]: rotate(8)
Out[8]:
array([[13, 14, 15, 16],
       [17, 18, 19, 20],
       [ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])

In [9]: rotate(2)
Out[9]:
array([[ 9, 10, 11, 12],
       [13, 14, 15, 16],
       [17, 18, 19, 20],
       [ 1,  2,  3,  4],
       [ 5,  6,  7,  8]])
0 голосов
/ 19 июля 2020

Это так просто, если использовать эту простую строчку кода. никаких функций и прочего не требуется.
просто используйте numpy.roll. см. Пояснения здесь .

# Assume your matrix is named a.
>>> a

array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12],
       [13, 14, 15, 16],
       [17, 18, 19, 20]])

>>> np.roll(a,-(n % len(a)),axis=0)

array([[ 9, 10, 11, 12],
       [13, 14, 15, 16],
       [17, 18, 19, 20],
       [ 1,  2,  3,  4],
       [ 5,  6,  7,  8]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...