Как сделать непрерывный случайный NaN в массиве python - PullRequest
2 голосов
/ 05 февраля 2020

Предположим, что есть массив со случайным числом

[[ 1. 3. 4. 5. 1. 2. 5. 7.]
[ 1. 3. 6. 4. 4. 0. 4. 0.]
[ 5. 0. 5. 1. 3. 0. 5. 1.]
[ 2. 1. 5. 4. 6. 1. 3. 4.]
[ 2. 1. 0. 0. 6. 1. 2. 1.]
[ 3. 5. 7. 2. 9. 6. 3. 5.]] 

Я хочу ввести 4 непрерывных NaN в этот массив, как показано ниже. Кроме того, NaN должно занимать около 20% от общего массива, что означает пропуск 20%. Этот массив состоит из 48 компонентов, поэтому требуется 10 компонентов NaN. Блок непрерывных NaN s должен быть введен в этот массив.

Если возможно, я хочу отрегулировать коэффициент непрерывности и отсутствующую частоту. (Коэффициент непрерывности означает число непрерывных NaN ...)

[[ 1. 3. NaN NaN NaN NaN 5. 7.]
[ 1. 3. 6. 4. 4. 0. 4. 0.]
[ 5. 0. 5. 1. 3. 0. 5. 1.]
[ NaN NaN NaN NaN 6. 1. 3. 4.]
[ 2. 1. 0. 0. 6. 1. 2. 1.]
[ 3. 5. 7. 2. 9. 6. NaN NaN]] 

В массиве много кода, создающего случайные NaN, но я не могу понять, как заменить значения на непрерывные NaNs. Сначала спасибо за вашу помощь!

1 Ответ

2 голосов
/ 05 февраля 2020

Я могу предложить этот подход, который далеко не оптимален, но он работает:

## data
import numpy as np
np.random.seed(42)

a = np.array([[1., 3., 4., 5., 1., 2., 5., 7.],
            [1., 3., 6., 4., 4., 0., 4., 0.],
            [5., 0., 5., 1., 3., 0., 5., 1.],
            [2., 1., 5., 4., 6., 1., 3., 4.],
            [2., 1., 0., 0., 6., 1., 2., 1.],
            [3., 5., 7., 2., 9., 6., 3., 5.]])

## NaN statistics definition
nan_ratio = 0.2
nan_seq_len = 4
number_of_nan_seq = int(nan_ratio * a.size / nan_seq_len)
nan_position = np.random.randint(0, a.size-nan_seq_len, size=number_of_nan_seq)

## NaN insertion
nan_indexes = np.ones([nan_position.size, nan_seq_len]) * nan_position[:, np.newaxis] + np.arange(0, nan_seq_len)
a_shape = a.shape
a_flat = a.flatten()
a_flat[nan_indexes.astype('int')] = np.nan
a = a_flat.reshape(a_shape)

output a:

array([[ 1.,  3.,  4.,  5.,  1.,  2.,  5.,  7.],
       [ 1.,  3.,  6.,  4.,  4.,  0.,  4.,  0.],
       [ 5.,  0.,  5.,  1.,  3.,  0.,  5.,  1.],
       [ 2.,  1.,  5.,  4., nan, nan, nan, nan],
       [ 2.,  1.,  0.,  0.,  6.,  1., nan, nan],
       [nan, nan,  7.,  2.,  9.,  6.,  3.,  5.]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...