web-dev-qa-db-ja.com

シャッフルvs順列numpy

numpy.random.shuffle(x)numpy.random.permutation(x)の違いは何ですか?

私はdocページを読みましたが、配列の要素をランダムにシャッフルしたいときに2つの間に違いがあるかどうか理解できませんでした。

より正確に言うと、配列_x=[1,4,2,8]_があるとします。

Xのランダムな順列を生成したい場合、shuffle(x)permutation(x)の違いは何ですか?

61
DotPi

_np.random.permutation_には、_np.random.shuffle_との2つの違いがあります。

  • 配列が渡された場合、配列のシャッフルされたcopyを返します。 _np.random.shuffle_は配列をその場でシャッフルします
  • 整数が渡された場合、シャッフルされた範囲、つまりnp.random.shuffle(np.arange(n))を返します

Xが整数の場合、np.arange(x)をランダムに並べ替えます。 xが配列の場合、コピーを作成し、要素をランダムにシャッフルします。

ソースコードはこれを理解するのに役立つかもしれません:

_3280        def permutation(self, object x):
...
3307            if isinstance(x, (int, np.integer)):
3308                arr = np.arange(x)
3309            else:
3310                arr = np.array(x)
3311            self.shuffle(arr)
3312            return arr
_
79
ecatmur

@ecatmurが言ったことに加えて、np.random.permutationは、特に分類のために順序付きペアをシャッフルする必要がある場合に役立ちます。

from np.random import permutation
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
y = iris.target

# Data is currently unshuffled; we should shuffle 
# each X[i] with its corresponding y[i]
perm = permutation(len(X))
X = X[perm]
y = y[perm]
22
hlin117