numpy 如何在python中随机 Shuffle 数据和目标?

txu3uszq  于 2023-01-02  发布在  Python
关注(0)|答案(6)|浏览(164)

我有一个4D数组训练图像,其维度对应于(image_number,channels,width,height)。我也有一个2D目标标签,其维度对应于(image_number,class_number)。当训练时,我想使用random.shuffle随机 Shuffle 数据,但我如何保持标签按我的图像的相同顺序 Shuffle ?谢谢!

px9o7tmv

px9o7tmv1#

from sklearn.utils import shuffle
import numpy as np

X = np.array([[0, 0, 0], [1, 1, 1], [2, 2, 2], [3, 3, 3], [4, 4, 4]])
y = np.array([0, 1, 2, 3, 4])
X, y = shuffle(X, y)
print(X)
print(y)


[[1 1 1]
 [3 3 3]
 [0 0 0]
 [2 2 2]
 [4 4 4]] 

[1 3 0 2 4]
iqjalb3h

iqjalb3h2#

还有另一种简单的方法,让我们假设总共有N个图像,然后我们可以做以下事情:

from random import shuffle

ind_list = [i for i in range(N)]
shuffle(ind_list)
train_new  = train[ind_list, :,:,:]
target_new = target[ind_list,]
zqdjd7g9

zqdjd7g93#

如果你想要一个只有数字的解决方案,你可以在第一个数组上重新索引第二个数组,假设你在两个数组中有相同的图像编号:

In [67]: train = np.arange(20).reshape(4,5).T

In [68]: target = np.hstack([np.arange(5).reshape(5,1), np.arange(100, 105).reshape(5,1)])

In [69]: train
Out[69]:
array([[ 0,  5, 10, 15],
       [ 1,  6, 11, 16],
       [ 2,  7, 12, 17],
       [ 3,  8, 13, 18],
       [ 4,  9, 14, 19]])

In [70]: target
Out[70]:
array([[  0, 100],
       [  1, 101],
       [  2, 102],
       [  3, 103],
       [  4, 104]])

In [71]: np.random.shuffle(train)

In [72]: target[train[:,0]]
Out[72]:
array([[  2, 102],
       [  3, 103],
       [  1, 101],
       [  4, 104],
       [  0, 100]])

In [73]: train
Out[73]:
array([[ 2,  7, 12, 17],
       [ 3,  8, 13, 18],
       [ 1,  6, 11, 16],
       [ 4,  9, 14, 19],
       [ 0,  5, 10, 15]])
ovfsdjhp

ovfsdjhp4#

如果你正在寻找一个同步/一致 Shuffle ,你可以使用以下功能。

def unisonShuffleDataset(a, b):
    assert len(a) == len(b)
    p = np.random.permutation(len(a))
    return a[p], b[p]

上面的例子只适用于2个变量。2通过在函数和函数的返回值上增加输入变量的数量,可以扩展到2个以上。

cidc1ykv

cidc1ykv5#

根据您要执行的操作,您还可以使用为数组的每个维度随机生成一个数字

random.randint(a, b)  #a and b are the extremes of your array

它会随机选择你的对象。

jdg4fx2g

jdg4fx2g6#

使用相同的种子多次构建随机数生成器以混洗不同的数组:

>>> seed = np.random.SeedSequence()
>>> arrays = [np.arange(10).repeat(i).reshape(10, -1) for i in range(1, 4)]
>>> for ar in arrays:
...     np.random.default_rng(seed).shuffle(ar)
...
>>> arrays
[array([[1],
        [2],
        [7],
        [8],
        [0],
        [4],
        [3],
        [6],
        [9],
        [5]]),
 array([[1, 1],
        [2, 2],
        [7, 7],
        [8, 8],
        [0, 0],
        [4, 4],
        [3, 3],
        [6, 6],
        [9, 9],
        [5, 5]]),
 array([[1, 1, 1],
        [2, 2, 2],
        [7, 7, 7],
        [8, 8, 8],
        [0, 0, 0],
        [4, 4, 4],
        [3, 3, 3],
        [6, 6, 6],
        [9, 9, 9],
        [5, 5, 5]])]

相关问题