Python, NumPy генерировать плохие данные - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь сделать рецензию на разные способы борьбы с неверными данными. сейчас я работаю над Null / None / Nan.

Я хочу преобразовать случайные значения в массиве в значение Null, а затем просто распечатать его или манипулировать им другими способами.

Я создаю данные как

iris = datasets.load_iris()
X = iris.data

И можно сделать случайную маску с

mask = np.random.random(size=X.shape)
mask = np.array([[True if y< .9 else False for y in x] for x in mask])

Но я не знаю, как применить эту маску к данным. Я хочу сохранить значение в X, если соответствующее значение в mask равно True, в противном случае преобразовать его в None

то, как я это делаю сейчас, не очень красиво, я чувствую, что существует более питонический способ

i= 0
while i < len(X):
    j=0
    while j < len(X[i]):
        X[i][j] = X[i][j] if mask[i][j] else None
        j=j+1
    i=i+1
print(X)

Ответы [ 3 ]

0 голосов
/ 02 мая 2018

Вы пробовали:

mask = np.random.random(size=X.shape)
X[mask > .9] = None

Рабочий пример:

x = np.ones((5, 5))
mask = np.random.random(size=x.shape)
# array([[ 0.46578606,  0.75331373,  0.05911855,  0.85127777,  0.85549141],
#        [ 0.20080012,  0.37121033,  0.69645537,  0.76756564,  0.42591026],
#        [ 0.84719144,  0.17824992,  0.81800073,  0.26026423,  0.89056928],
#        [ 0.90355276,  0.93950118,  0.62471001,  0.17618564,  0.15952916],
#        [ 0.08325249,  0.64214048,  0.60089593,  0.94820258,  0.62338702]])
x[mask > .9] = None
# array([[  1.,   1.,   1.,   1.,   1.],
#        [  1.,   1.,   1.,   1.,   1.],
#        [  1.,   1.,   1.,   1.,   1.],
#        [ nan,  nan,   1.,   1.,   1.],
#        [  1.,   1.,   1.,  nan,   1.]])
0 голосов
/ 02 мая 2018
mask = np.random.choice([False, True], size=X.shape, p=[0.9, 0.1])
X[mask] = np.nan

Вот минимальный ipython сеанс с вашим набором данных, если вы хотите посмотреть, как он работает

In [1]: import numpy as np
In [2]: from sklearn import datasets
In [3]: iris = datasets.load_iris()
In [4]: X = iris.data[:6]
In [5]: X
Out[5]: 
array([[5.1, 3.5, 1.4, 0.2],
       [4.9, 3. , 1.4, 0.2],
       [4.7, 3.2, 1.3, 0.2],
       [4.6, 3.1, 1.5, 0.2],
       [5. , 3.6, 1.4, 0.2],
       [5.4, 3.9, 1.7, 0.4]])

In [6]: mask = np.random.choice([False, True], size=X.shape, p=[0.9, 0.1])
In [7]: mask.astype(int)
Out[7]: 
array([[0, 0, 0, 0],
       [1, 0, 0, 0],
       [1, 0, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0],
       [0, 1, 0, 0]])

In [8]: X[mask] = np.nan
In [9]: X
Out[9]: 
array([[5.1, 3.5, 1.4, 0.2],
       [nan, 3. , 1.4, 0.2],
       [nan, 3.2, 1.3, 0.2],
       [4.6, 3.1, 1.5, 0.2],
       [5. , 3.6, 1.4, 0.2],
       [5.4, nan, 1.7, 0.4]])
0 голосов
/ 02 мая 2018

Вы можете использовать списки, чтобы написать их в одну строку:

X = [ [ xi if mi else None for xi, mi in zip(x,m) ] for x, m in zip(X, mask) ]
...