2つのnumpy配列を一斉にシャッフルするためのより良い方法

|

形状が異なるが長さが同じ(リーディングディメンション)の2つのnumpy配列があります。対応する要素が引き続き対応するように、それぞれをシャッフルしたいと思います。つまり、主要なインデックスに関して一致してシャッフルします。

このコードは機能し、私の目標を示しています。

  def shuffle_in_unison(a、b):assert len(a)== len(b)shuffled_a = numpy.empty(a.shape、dtype = a.dtype)shuffled_b = numpy.empty(b.shape、 dtype = b.dtype)permutation = numpy.random.permutation(len(a))for old_index、new_index in enumerate(permutation):shuffled_a [new_index] = a [old_index] shuffled_b [new_index] = b [old_index] return shuffled_a、 shuffled_b  

例:

 >>> a = numpy.asarray([[1、1]、[2、2]、[3、3]])>>> b = numpy.asarray([1、2、3])>>> shuffle_in_unison(a、b)(array([[2、2]、[1、1]、[3、3]])、array([2、1、3])) 

ただし、これは不格好で非効率的で時間がかかるため、アレイのコピーを作成する必要があります。アレイはかなり大きくなるため、インプレースでシャッフルしたいと思います。

これについて行くより良い方法はありますか?実行の高速化とメモリ使用量の削減が私の主な目標ですが、エレガントなコードもいいでしょう。

もう1つ考えたのは、次のとおりです。

  def shuffle_in_unison_scary(a、 b):rng_state = numpy.random.get_state()numpy.random.shuffle(a)numpy.random.set_state(rng_state)numpy.random.shuffle(b) 

これは機能します。 ..しかし、それは「少し怖いです。私はそれが機能し続けるという保証はほとんどないと思います。たとえば、numpyバージョン全体で存続することが保証されているようなもののようには見えません。