Эффективно переставляйте массив по строкам, используя Numpy

#python #performance #numpy

Вопрос:

Учитывая 2D-массив, я хотел бы переставить этот массив по строкам.

В настоящее время я создам цикл for для перестановки 2D-массива строка за строкой, как показано ниже:

 for i in range(npart):
    pr=np.random.permutation(range(m))
    # arr_rand3 is the same as arr, but with each row permuted
    arr_rand3[i,:]=arr[i,pr]
 

Но мне интересно, есть ли внутри какая-то настройка Numpy , которая может выполнять это в одной строке (без цикла for).

Полный код таков

 import numpy as np

arr=np.array([[0,0,0,0,0],[0,4,1,1,1],[0,1,1,2,2],[0,3,2,2,2]])
npart=len(arr[:,0])
m=len(arr[0,:])
# Permuted version of arr
arr_rand3=np.zeros(shape=np.shape(arr),dtype=np.int)
# Nodal association matrix for C
X=np.zeros(shape=(m,m),dtype=np.double)
# Random nodal association matrix for C_rand3
X_rand3=np.zeros(shape=(m,m),dtype=np.double)
  
for i in range(npart):
    pr=np.random.permutation(range(m))
    # arr_rand3 is the same as arr, but with each row permuted
    arr_rand3[i,:]=arr[i,pr]
 

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

1. Какую версию numpy вы используете?

2. Спасибо за интерес к этой операции, я использую numpy==1.19.5

Ответ №1:

В Numpy 1.19 вы должны уметь это делать:

 import numpy as np

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

rng = np.random.default_rng()
arr_rand3 = rng.permutation(arr, axis=1)

print(arr_rand3)
 

Выход

 [[0 0 0 0 0]
 [4 0 1 1 1]
 [1 0 1 2 2]
 [3 0 2 2 2]]
 

Согласно документации, метод random.Generator.permutation получает новый параметр axis :

ось int, опционально
Ось, по которой перемещается x. Значение по умолчанию равно 0.