рандомизация двух списков (numpy in) и поддержание порядка в python - PullRequest
0 голосов
/ 29 декабря 2018

У меня есть два двухмерных списка.Я хочу перетасовать его, но только внешнюю сторону перемешать.

Если я рандомизирую список заказов a, я хочу, чтобы список b следовал порядку списка a.

Я видел рандомизацию двух спискови поддержание порядка в python , но, похоже, это не работает для меня.

Ниже приведен код, которым я сейчас занимаюсь.

Но это слишком медленно для больших списков с пустыми местами.

import numpy as np
import random    

a = np.array([[1,2,3], [4,5,6], [7,8,9], [10,11,12]])
b = np.array([[100,200,300,400,500], [600,700,800,900,901], [101,102,103,104,105], [501,502,503,504,505]])
r = [i for i in range(4)]
random.shuffle(r)
newa = np.empty((0, 3))
newb = np.empty((0, 5))
for rr in r:
    newa = np.append(newa, [a[rr]], axis=0)
    newb = np.append(newb, [b[rr]], axis=0)
print(newa)
print(newb)

Какой-нибудь питонический или более быстрый способ сделать это?

Спасибо за ответ.

Ответы [ 3 ]

0 голосов
/ 29 декабря 2018

У вас правильная идея, но добавление в массив занимает очень много времени, поскольку каждый раз он перераспределяет весь буфер.Вместо этого вы можете просто использовать перетасованный индекс:

a = np.array([[1,2,3], [4,5,6], [7,8,9], [10,11,12]])
b = np.array([[100,200,300,400,500], [600,700,800,900,901], [101,102,103,104,105], [501,502,503,504,505]])

r = np.arange(4)
np.random.shuffle(r)

newa = a[r]
newb = b[r]
0 голосов
/ 29 декабря 2018

Используйте опцию shuffle в самой numpy, это будет намного эффективнее.

np.random.shuffle(a)
np.random.shuffle(b)

print(a)
#
[[ 4  5  6]
 [10 11 12]
 [ 7  8  9]
 [ 1  2  3]]
print(b)
#
[[600 700 800 900 901]
 [100 200 300 400 500]
 [501 502 503 504 505]
 [101 102 103 104 105]]
0 голосов
/ 29 декабря 2018

Я не на 100% по производительности, но я думаю, что это может работать лучше для вас:

newa = np.copy(a)
np.random.shuffle(newa)
newb = np.copy(b)
np.random.shuffle(newb)

Вам нужно, чтобы они были в том же случайном порядке?Так, если элемент 1 перемещается в положение 3 в newa, должно ли это движение также произойти в newb?Вот каков ваш код, но вы не указали в своем вопросе.Если вы хотите использовать тот же случайный порядок для обоих, вам нужно сделать что-то вроде этого:

indexes = np.arrange(len(a))
np.random.shuffle(indexes)
newa = a[indexes]
newb = b[indexes]

Это будет быстрее, чем у вас, так как все вызовы добавления замедляют вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...