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。自己细细地拆解一下,并输出打印观察你能学会的更多。