numpy必知必会-第七天

31 如何查找百分位数

第q个百分位数是这样一个值,它使得至少有q%的数据项小于或等于这个值,且至少有(100-q)%的数据项大于或等于这个值。
例如:
输入test = np.arange(100)
要保证有5个数小于这个百分位数q,该如何解决

解决方法

test = np.arange(100)
np.percentile(test, q=[5])

输出

array([4.95])

Tips>np.percentile(test, q=[5])中的q可以指定多个百分位数,例如q=[5, 90]

32 把一个2D array中的20 个数据,随机赋值为1000

例如:
输入:
test = np.arange(100).reshape(10, 10)
输出:
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 1000, 9],
[ 10, 11, 12, 13, 1000, 1000, 16, 17, 1000, 19],
[ 20, 1000, 22, 23, 24, 25, 26, 27, 28, 29],
[ 30, 1000, 32, 33, 34, 1000, 36, 37, 38, 39],
[ 40, 41, 42, 43, 44, 45, 46, 47, 1000, 49],
[ 50, 51, 52, 53, 54, 55, 56, 57, 58, 59],
[ 60, 61, 62, 63, 64, 65, 66, 1000, 68, 69],
[ 70, 71, 72, 73, 74, 75, 76, 77, 78, 1000],
[ 80, 81, 82, 1000, 84, 85, 86, 1000, 88, 89],
[ 90, 91, 1000, 93, 94, 1000, 1000, 97, 98, 99]])

解决方法:

test  = np.arange(100).reshape(10, 10)
i, j = np.where(test)
test[np.random.choice((i), 20), np.random.choice((j), 20)] = 1000
test

输出

array([[   0,    1,    2,    3,    4,    5,    6,    7, 1000,    9],
       [  10,   11,   12,   13, 1000, 1000,   16,   17, 1000,   19],
       [  20, 1000,   22,   23,   24,   25,   26,   27,   28,   29],
       [  30, 1000,   32,   33,   34, 1000,   36,   37,   38,   39],
       [  40,   41,   42,   43,   44,   45,   46,   47, 1000,   49],
       [  50,   51,   52,   53,   54,   55,   56,   57,   58,   59],
       [  60,   61,   62,   63,   64,   65,   66, 1000,   68,   69],
       [  70,   71,   72,   73,   74,   75,   76,   77,   78, 1000],
       [  80,   81,   82, 1000,   84,   85,   86, 1000,   88,   89],
       [  90,   91, 1000,   93,   94, 1000, 1000,   97,   98,   99]])

i, j = np.where(test), i,j里面分别存放了row和col的坐标。np.random.choice((i), 20)就是从i中选出20个元素来。
另外也可以通过np.random.randint(150, size=20)来选取随机数,从0~149选出20个数来。

33 查找缺失值所在的位置

例如:
输入

url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'
iris_2d = np.genfromtxt(url, delimiter=',', dtype='float')
iris_2d[np.random.randint(150, size=20), np.random.randint(4, size=20)] = np.nan

通过上面的方法,随机造成若干个元素设置为nan,造成缺失值。接下来找到缺失值所在的位置并输出他们。

解决办法

url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'
iris_2d = np.genfromtxt(url, delimiter=',', dtype='float', usecols=[0,1,2,3])
iris_2d[np.random.randint(150, size=20), np.random.randint(4, size=20)] = np.nan
print("Number of missing values: \n", np.isnan(iris_2d).sum())
print("Position of missing values: \n", np.where(np.isnan(iris_2d)))

输出

Number of missing values: 
 20
Position of missing values: 
 (array([  0,  21,  33,  36,  38,  39,  49,  73,  75,  79,  79,  81,  82,
        84,  88,  88, 124, 129, 141, 147]), array([3, 3, 2, 1, 0, 2, 2, 2, 3, 0, 2, 2, 2, 1, 0, 3, 3, 0, 1, 3]))

34 如何使用2个以上的条件来过滤array中的数据。

例如:
操作iris_2d array
构建条件第三列中的数值>1.5, 第一列中的元素<5.0,执行过滤操作。

解决办法:

url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'
iris_2d = np.genfromtxt(url, delimiter=',', dtype='float', usecols=[0,1,2,3])

condition = (iris_2d[:, 2] > 1.5) & (iris_2d[:, 0] < 5.0)
iris_2d[condition]

输出

array([[4.8, 3.4, 1.6, 0.2],
       [4.8, 3.4, 1.9, 0.2],
       [4.7, 3.2, 1.6, 0.2],
       [4.8, 3.1, 1.6, 0.2],
       [4.9, 2.4, 3.3, 1. ],
       [4.9, 2.5, 4.5, 1.7]])

35 丢弃包含缺失值的行。

例如:

url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'
iris_2d = np.genfromtxt(url, delimiter=',', dtype='float', usecols=[0,1,2,3])
iris_2d[np.random.randint(150, size=20), np.random.randint(4, size=20)] = np.nan

构建数据集合iris_2d,并把其中的若干元素设置为缺失值。如何找到它们,并把包含缺失值的行丢弃掉。这样的两行数据:

[5. , 3.6, nan, 0.2],
 [5.4, 3.9, 1.7, 0.4]

我们只保留[5.4, 3.9, 1.7, 0.4]这一行。

解决方法:

url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'
iris_2d = np.genfromtxt(url, delimiter=',', dtype='float', usecols=[0,1,2,3])
iris_2d[np.random.randint(150,  size=50 ), np.random.randint(4, size=50)] = np.nan
nan_mask = np.array([~np.any(np.isnan(row)) for row in iris_2d])
iris_2d[nan_mask][:20]

输出

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],
       [5. , 3.4, 1.5, 0.2],
       [4.4, 2.9, 1.4, 0.2],
       [5.4, 3.7, 1.5, 0.2],
       [4.8, 3.4, 1.6, 0.2],
       [4.8, 3. , 1.4, 0.1],
       [4.3, 3. , 1.1, 0.1],
       [5.7, 4.4, 1.5, 0.4],
       [5.1, 3.5, 1.4, 0.3],
       [5.1, 3.8, 1.5, 0.3],
       [5.4, 3.4, 1.7, 0.2],
       [5.1, 3.7, 1.5, 0.4],
       [5.1, 3.3, 1.7, 0.5],
       [4.8, 3.4, 1.9, 0.2],
       [5. , 3. , 1.6, 0.2]])

解读:nan_mask的思想就是构建一个array,里面的每个元素代表一行,保留的行值为True,不保留的行值为False。

nan_mask

输出

array([ True,  True,  True,  True,  True,  True, False,  True,  True,
       False,  True,  True,  True,  True, False,  True, False,  True,
       False,  True,  True,  True, False,  True,  True,  True,  True,
        True,  True, False,  True,  True, False,  True,  True,  True,
        True, False,  True,  True, False, False, False, False,  True,
       False, False,  True, False,  True, False, False,  True,  True,
        True,  True,  True,  True, False,  True,  True,  True, False,
       False,  True,  True,  True, False,  True, False,  True,  True,
        True,  True,  True,  True, False,  True,  True,  True,  True,
        True, False, False, False,  True, False,  True,  True, False,
        True,  True,  True, False,  True,  True,  True, False,  True,
        True,  True,  True,  True,  True,  True,  True,  True, False,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True, False,  True,  True, False,  True,  True, False, False,
        True, False,  True, False,  True,  True,  True, False, False,
        True,  True, False,  True, False,  True,  True, False,  True,
        True,  True, False,  True,  True,  True])

有了这个思路以后就好办了,np.array([~np.any(np.isnan(row)) for row in iris_2d])。最外面的np.array是用来构建array的我们可以忽略,重点就是[~np.any(np.isnan(row)) for row in iris_2d]这个列表解析了。其中row for row in iris_2d 是用来遍历2d array用来获取行的,np.isnan(row)用来操作行内的每一个元素,如果是nan就返回True,否则为False。np.any(np.isnan(row))这个意思就是说如果行内只要有一个元素是nan就返回True。 最后的“”是取反的意思,合起来np.any(np.isnan(row))就是只要这行有一个元素是nan就不要了,最后的结果是False。自己细细地拆解一下,并输出打印观察你能学会的更多。

你可能感兴趣的:(numpy必知必会-第七天)