簡體   English   中英

如何獲取數組中某些值的Nan值

[英]How to get Nan values for certain values in array

我正在生成一些隨機數,並且嘗試應用一個條件,如果值> 80,則將其設置為None,但是我無法獲得結果。 我的代碼如下

import pandas as pd
import numpy as np
from numpy import random

total = 200 
rand_numbers = np.random.randint(0, 100, total)
corrupt_values = np.random.randint(0, 100, total) > 80
flag = False
if flag:
    rand_numbers = [v for flag, v in zip(corrupt_values, rand_numbers)]
else:
   rand_numbers = None
print 'rand_numbers: ', rand_numbers

我正在嘗試獲得類似的結果

rand_numbers [20, 50, Nan, Nan, 40, 10] so that values greater than 80 are replaced by Nan

我試圖在rand_numbers中生成200個隨機數,然后做出一個條件,即如果值超過80,則它將放置NaN而不是其他值。 我正在嘗試壓縮這兩個數組並使該條件起作用,但是我正在為此苦苦掙扎。 我是編碼新手。 任何幫助將不勝感激。

似乎您需要先強制轉換值才能float (因為NaNfloat ),然后按條件更改值:

np.random.seed(100)
total = 100 
rand_numbers = np.random.randint(0, 100, total)
corrupt_values = rand_numbers > 80
print (rand_numbers)
[ 8 24 67 87 79 48 10 94 52 98 53 66 98 14 34 24 15 60 58 16  9 93 86  2 27
  4 31  1 13 83  4 91 59 67  7 49 47 65 61 14 55 71 80  2 94 19 98 63 53 27
 56 30 48 47 39 38 44 18 64 56 34 53 74 17 72 13 30 17 53 68 50 91 91 83 53
 78  0 13 57 76  3 70  3 84 79 10 87 60  3 48 52 43 36  5 71 38 86 94 98 42]

print (corrupt_values)
[False False False  True False False False  True False  True False False
  True False False False False False False False False  True  True False
 False False False False False  True False  True False False False False
 False False False False False False False False  True False  True False
 False False False False False False False False False False False False
 False False False False False False False False False False False  True
  True  True False False False False False False False False False  True
 False False  True False False False False False False False False False
  True  True  True False]

rand_numbers = rand_numbers.astype(float)
rand_numbers[corrupt_values] = None
print (rand_numbers)
[  8.  24.  67.  nan  79.  48.  10.  nan  52.  nan  53.  66.  nan  14.  34.
  24.  15.  60.  58.  16.   9.  nan  nan   2.  27.   4.  31.   1.  13.  nan
   4.  nan  59.  67.   7.  49.  47.  65.  61.  14.  55.  71.  80.   2.  nan
  19.  nan  63.  53.  27.  56.  30.  48.  47.  39.  38.  44.  18.  64.  56.
  34.  53.  74.  17.  72.  13.  30.  17.  53.  68.  50.  nan  nan  nan  53.
  78.   0.  13.  57.  76.   3.  70.   3.  nan  79.  10.  nan  60.   3.  48.
  52.  43.  36.   5.  71.  38.  nan  nan  nan  42.]

numpy.where類似的解決方案(來自已刪除的答案):

rand_numbers = rand_numbers.astype(float)
rand_numbers = np.where(corrupt_values, np.nan, rand_numbers)
print (rand_numbers)
[  8.  24.  67.  nan  79.  48.  10.  nan  52.  nan  53.  66.  nan  14.  34.
  24.  15.  60.  58.  16.   9.  nan  nan   2.  27.   4.  31.   1.  13.  nan
   4.  nan  59.  67.   7.  49.  47.  65.  61.  14.  55.  71.  80.   2.  nan
  19.  nan  63.  53.  27.  56.  30.  48.  47.  39.  38.  44.  18.  64.  56.
  34.  53.  74.  17.  72.  13.  30.  17.  53.  68.  50.  nan  nan  nan  53.
  78.   0.  13.  57.  76.   3.  70.   3.  nan  79.  10.  nan  60.   3.  48.
  52.  43.  36.   5.  71.  38.  nan  nan  nan  42.]

您可以使用列表理解

import numpy as np

total = 200 
rand_numbers = np.random.randint(0, 100, total)

result=[i if i<=80 else float('NaN') for i in rand_numbers]

那會給你:

 >>> result
[64, 23, 12, 8, 70, nan, 13, 19, 73, 18, 78, 25, 77, 45, nan, 6, 15, nan, nan, 47, nan, 39, 5, 9, 22, 59, 57, 71, 8, 24, 76, 33, 66, nan, 21, 39, 48, 23, 40, nan, nan, 75, 68, 17, 52, nan, 71, 55, 10, 53, 51, 21, 35, 6, 67, 10, 34, nan, 24, 11, 42, 72, 74, 40, 63, 8, 57, 10, nan, 45, nan, 18, nan, 80, 6, 21, 22, 2, 51, 54, 80, 50, 63, 40, nan, 26, 43, 65, 7, 13, 54, 69, 12, nan, nan, 40, 44, nan, 78, 45, 55, 72, 6, 46, 43, 33, 24, 69, 77, 51, 52, 51, nan, 32, 22, 54, 53, 25, 61, 32, 8, nan, 75, 9, 22, nan, nan, 54, 32, 49, nan, 8, 59, 44, 14, 62, 61, 37, 60, 56, 12, 23, 50, 76, 5, 14, 46, nan, 58, 18, 53, 18, 39, 10, 1, 17, 36, 31, 42, 71, 61, 39, 27, 79, nan, 44, 76, nan, 26, 3, 26, 19, 64, 6, 41, 65, 76, 31, nan, 12, nan, 77, 8, 49, nan, nan, nan, 5, 40, 15, nan, 42, 14, 12, 75, 54, 47, 65, 9, 12]

編輯

也有可能:

import numpy as np

total = 200 
rand_numbers = np.random.randint(0, 100, total)
corrupt_values = rand_numbers > 80

result=[i[0] if i[1]==False else float('nan') for i in zip(rand_numbers, corrupt_values)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM