Ваше "страшное" решение не кажется мне пугающим.Вызов shuffle()
для двух последовательностей одинаковой длины приводит к одинаковому количеству вызовов к генератору случайных чисел, и это единственные «случайные» элементы в алгоритме случайного перемешивания.Сбрасывая состояние, вы гарантируете, что вызовы генератора случайных чисел дадут одинаковые результаты при втором вызове shuffle()
, поэтому весь алгоритм будет генерировать одну и ту же перестановку.
Если вы этого не сделаететаким образом, другое решение будет хранить ваши данные в одном массиве вместо двух с самого начала и создавать два представления в этом едином массиве, имитируя два имеющихся у вас массива.Вы можете использовать один массив для перетасовки и представления для всех других целей.
Пример: предположим, что массивы a
и b
выглядят так:
a = numpy.array([[[ 0., 1., 2.],
[ 3., 4., 5.]],
[[ 6., 7., 8.],
[ 9., 10., 11.]],
[[ 12., 13., 14.],
[ 15., 16., 17.]]])
b = numpy.array([[ 0., 1.],
[ 2., 3.],
[ 4., 5.]])
Мы можемТеперь создайте один массив, содержащий все данные:
c = numpy.c_[a.reshape(len(a), -1), b.reshape(len(b), -1)]
# array([[ 0., 1., 2., 3., 4., 5., 0., 1.],
# [ 6., 7., 8., 9., 10., 11., 2., 3.],
# [ 12., 13., 14., 15., 16., 17., 4., 5.]])
Теперь мы создадим представления, имитирующие исходные a
и b
:
a2 = c[:, :a.size//len(a)].reshape(a.shape)
b2 = c[:, a.size//len(a):].reshape(b.shape)
Данные a2
иb2
используется совместно с c
.Чтобы перетасовать оба массива одновременно, используйте numpy.random.shuffle(c)
.
. В рабочем коде вы, конечно, постараетесь вообще не создавать оригинальные a
и b
и сразу же создайте c
, * 1029.* и b2
.
Это решение может быть адаптировано к случаю, когда a
и b
имеют разные dtypes.