我有一个4D阵列训练图像,其尺寸对应于(image_number,通道,宽度,高度)。我还有一个2D目标标签,其尺寸对应于(image_number,class_number)。在训练时,我想通过使用random.shuffle随机地移动数据,但是如何保持标签与我的图像的相同顺序混洗? THX!
答案 0 :(得分:9)
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]
答案 1 :(得分:7)
还有另一种简单的方法可以做到这一点。我们假设有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,]
答案 2 :(得分:3)
如果你想要一个只有numpy的解决方案,你可以在第一个数据上重新索引第二个数组,假设你们两个都有相同的图像数字:
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]])
答案 3 :(得分:0)
如果您正在寻找同步/统一洗牌,您可以使用以下功能。
def unisonShuffleDataset(a, b):
assert len(a) == len(b)
p = np.random.permutation(len(a))
return a[p], b[p]
上面的仅适用于 2 个 numpy。通过在 func 上添加输入变量的数量,可以扩展到 2 个以上。以及函数的返回。
答案 4 :(得分:-1)
根据您的目的,您还可以使用
为数组的每个维度随机生成一个数字random.randint(a, b) #a and b are the extremes of your array
可在您的对象中随机选择。