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