Случайно удалить 30% значений в массиве NumPy - PullRequest
0 голосов
/ 09 июня 2018

У меня есть двумерный массив, который содержит мои значения (некоторые из них могут быть NaN).Я хочу удалить 30% значений, отличных от NaN, и заменить их средним значением массива.Как я могу это сделать?То, что я пробовал до сих пор:

def spar_removal(array, mean_value, sparseness):
    array1 = deepcopy(array)
    array2 = array1
    spar_size = int(round(array2.shape[0]*array2.shape[1]*sparseness))
    for i in range (0, spar_size):
        index = np.random.choice(np.where(array2 != mean_value)[1])
        array2[0, index] = mean_value
    return array2

Но это просто выбор той же строки моего массива.Как я могу удалить из всего массива?Кажется, что выбор работает только для одного измерения.Я предполагаю, что мне нужно вычислить пары (x, y), которые я заменил бы на mean_value.

.

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Так как, где возвращает два массива содержит индексы, это то, что вы хотите:

def spar_removal(array, mean_value, sparseness):

    array1 = copy.deepcopy(array)
    array2 = array1
    spar_size = int(round(array2.shape[0]*array2.shape[1]*sparseness))
    # This is used to filtered out nan
    indexs = np.where(array2==array2)
    indexsL = len(indexs[0])

    for i in np.random.choice(indexsL,spar_size,replace=False):
        indexX = indexs[0][i]
        indexY = indexs[1][i]
        array2[indexX,indexY] = mean_value

return array2
0 голосов
/ 09 июня 2018

Вероятно, есть лучший способ, но рассмотрим:

import numpy as np

x = np.array([[1,2,3,4],
              [1,2,3,4],
              [np.NaN, np.NaN, np.NaN, np.NaN],
              [1,2,3,4]])

# Get a vector of 1-d indexed indexes of non NaN elements
indices = np.where(np.isfinite(x).ravel())[0]

# Shuffle the indices, select the first 30% (rounded down with int())
to_replace = np.random.permutation(indices)[:int(indices.size * 0.3)]

# Replace those indices with the mean (ignoring NaNs)
x[np.unravel_index(to_replace, x.shape)] = np.nanmean(x)

print(x)

Пример выходных данных

[[ 2.5  2.   2.5  4. ]
 [ 1.   2.   3.   4. ]
 [ nan  nan  nan  nan]
 [ 2.5  2.   3.   4. ]]

NaN никогда не изменится и пол (0,3 * число не-NaN элементов) будет установлено на среднее значение (среднее значение, игнорирующее NaNs).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...