У меня есть двумерный массив X
с формой (n_samples, n_features)
.Я хочу применить маскирующий шум к каждому сэмплу, то есть к каждому ряду.По сути, для каждой записи строки я хочу случайным образом выбрать долю frac
от общего числа n_features
элементов и установить для них значение 0
.
. Я до сих пор векторизовал внутреннюю часть цикла,но не могу избавиться от внешней i
петли.
Мой текущий код приведен ниже.
def add_noise(X, frac):
X_noise = X.copy()
n_samples = X.shape[0]
n_features = X.shape[1]
for i in range(n_samples):
mask = np.random.randint(0, n_features, int(frac * n_features))
X_noise[i][mask] = 0
return X_noise
Пример показан ниже.
test_arr = np.arange(1, 11)
test_arr = np.array([test_arr, test_arr])
print(test_arr)
print(add_noise(test_arr, 0.3))
[[ 1 2 3 4 5 6 7 8 9 10]
[ 1 2 3 4 5 6 7 8 9 10]]
[[ 1 0 3 4 5 6 0 8 9 0] # 0.3 * num_features = 3 random elements
[ 0 2 3 4 5 6 7 0 0 10]] # for each row set to 0
Какизбавиться от внешнего цикла?