本次练习使用 鸢尾属植物数据集iris.data
,在这个数据集中,包括了三类不同的鸢尾属植物:Iris Setosa,Iris Versicolour,Iris Virginica。每类收集了50个样本,因此这个数据集一共包含了150个样本。
- sepallength:萼片长度
- sepalwidth:萼片宽度
- petallength:花瓣长度
- petalwidth:花瓣宽度
以上四个特征的单位都是厘米(cm)。
sepallength sepalwidth petallength petalwidth species
0 5.1 3.5 1.4 0.2 Iris-setosa
1 4.9 3.0 1.4 0.2 Iris-setosa
2 4.7 3.2 1.3 0.2 Iris-setosa
3 4.6 3.1 1.5 0.2 Iris-setosa
4 5.0 3.6 1.4 0.2 Iris-setosa
.. ... ... ... ... ...
145 6.7 3.0 5.2 2.3 Iris-virginica
146 6.3 2.5 5.0 1.9 Iris-virginica
147 6.5 3.0 5.2 2.0 Iris-virginica
148 6.2 3.4 5.4 2.3 Iris-virginica
149 5.9 3.0 5.1 1.8 Iris-virginica
[150 rows x 5 columns]
1. 导入鸢尾属植物数据集,保持文本不变。
【知识点:输入和输出】
- 如何导入存在数字和文本的数据集?
import numpy as np
outfile = r'iris.data'
iris_data = np.loadtxt(outfile,dtype=object,delimiter=',')
print(iris_data.shape)
print(iris_data[1:10])
(151, 5)
[['5.1' '3.5' '1.4' '0.2' 'Iris-setosa']
['4.9' '3.0' '1.4' '0.2' 'Iris-setosa']
['4.7' '3.2' '1.3' '0.2' 'Iris-setosa']
['4.6' '3.1' '1.5' '0.2' 'Iris-setosa']
['5.0' '3.6' '1.4' '0.2' 'Iris-setosa']
['5.4' '3.9' '1.7' '0.4' 'Iris-setosa']
['4.6' '3.4' '1.4' '0.3' 'Iris-setosa']
['5.0' '3.4' '1.5' '0.2' 'Iris-setosa']
['4.4' '2.9' '1.4' '0.2' 'Iris-setosa']]
2. 求出鸢尾属植物萼片长度的平均值、中位数和标准差(第1列,sepallength)
【知识点:统计相关】
- 如何计算numpy数组的均值,中位数,标准差?
import numpy as np
outfile = r'iris.data'
sepallength = np.loadtxt(outfile,dtype=float,delimiter=',',usecols=[0],skiprows=1)
print(sepallength[0:10])
# print mean,median,std
mean,median,std = np.mean(sepallength),np.median(sepallength),np.std(sepallength)
print('平均值:',mean,' 中位数:',median,' 标准差:',std,end='\n')
[5.1 4.9 4.7 4.6 5. 5.4 4.6 5. 4.4 4.9]
平均值: 5.843333333333334 中位数: 5.8 标准差: 0.8253012917851409
3. 创建一种标准化形式的鸢尾属植物萼片长度,其值正好介于0和1之间,这样最小值为0,最大值为1(第1列,sepallength)。
【知识点:统计相关】
- 如何标准化数组?
- 数据标准化常见方法
import numpy as np
outfile = r'iris.data'
sepallength = np.loadtxt(outfile,dtype=float,delimiter=',',usecols=[0],skiprows=1)
# 方法1
max,min= np.max(sepallength),np.min(sepallength)
result = (sepallength - min) / (max - min)
print(s)
# 方法2
result = (sepallength - min) / np.ptp(sepallength)
print(result)
[0.22222222 0.16666667 0.11111111 0.08333333 0.19444444 0.30555556
0.08333333 0.19444444 0.02777778 0.16666667 0.30555556 0.13888889
0.13888889 0. 0.41666667 0.38888889 0.30555556 0.22222222
0.38888889 0.22222222 0.30555556 0.22222222 0.08333333 0.22222222
0.13888889 0.19444444 0.19444444 0.25 0.25 0.11111111
0.13888889 0.30555556 0.25 0.33333333 0.16666667 0.19444444
0.33333333 0.16666667 0.02777778 0.22222222 0.19444444 0.05555556
0.02777778 0.19444444 0.22222222 0.13888889 0.22222222 0.08333333
0.27777778 0.19444444 0.75 0.58333333 0.72222222 0.33333333
0.61111111 0.38888889 0.55555556 0.16666667 0.63888889 0.25
0.19444444 0.44444444 0.47222222 0.5 0.36111111 0.66666667
0.36111111 0.41666667 0.52777778 0.36111111 0.44444444 0.5
0.55555556 0.5 0.58333333 0.63888889 0.69444444 0.66666667
0.47222222 0.38888889 0.33333333 0.33333333 0.41666667 0.47222222
0.30555556 0.47222222 0.66666667 0.55555556 0.36111111 0.33333333
0.33333333 0.5 0.41666667 0.19444444 0.36111111 0.38888889
0.38888889 0.52777778 0.22222222 0.38888889 0.55555556 0.41666667
0.77777778 0.55555556 0.61111111 0.91666667 0.16666667 0.83333333
0.66666667 0.80555556 0.61111111 0.58333333 0.69444444 0.38888889
0.41666667 0.58333333 0.61111111 0.94444444 0.94444444 0.47222222
0.72222222 0.36111111 0.94444444 0.55555556 0.66666667 0.80555556
0.52777778 0.5 0.58333333 0.80555556 0.86111111 1.
0.58333333 0.55555556 0.5 0.94444444 0.55555556 0.58333333
0.47222222 0.72222222 0.66666667 0.72222222 0.41666667 0.69444444
0.66666667 0.66666667 0.55555556 0.61111111 0.52777778 0.44444444]
[0.22222222 0.16666667 0.11111111 0.08333333 0.19444444 0.30555556
0.08333333 0.19444444 0.02777778 0.16666667 0.30555556 0.13888889
0.13888889 0. 0.41666667 0.38888889 0.30555556 0.22222222
0.38888889 0.22222222 0.30555556 0.22222222 0.08333333 0.22222222
0.13888889 0.19444444 0.19444444 0.25 0.25 0.11111111
0.13888889 0.30555556 0.25 0.33333333 0.16666667 0.19444444
0.33333333 0.16666667 0.02777778 0.22222222 0.19444444 0.05555556
0.02777778 0.19444444 0.22222222 0.13888889 0.22222222 0.08333333
0.27777778 0.19444444 0.75 0.58333333 0.72222222 0.33333333
0.61111111 0.38888889 0.55555556 0.16666667 0.63888889 0.25
0.19444444 0.44444444 0.47222222 0.5 0.36111111 0.66666667
0.36111111 0.41666667 0.52777778 0.36111111 0.44444444 0.5
0.55555556 0.5 0.58333333 0.63888889 0.69444444 0.66666667
0.47222222 0.38888889 0.33333333 0.33333333 0.41666667 0.47222222
0.30555556 0.47222222 0.66666667 0.55555556 0.36111111 0.33333333
0.33333333 0.5 0.41666667 0.19444444 0.36111111 0.38888889
0.38888889 0.52777778 0.22222222 0.38888889 0.55555556 0.41666667
0.77777778 0.55555556 0.61111111 0.91666667 0.16666667 0.83333333
0.66666667 0.80555556 0.61111111 0.58333333 0.69444444 0.38888889
0.41666667 0.58333333 0.61111111 0.94444444 0.94444444 0.47222222
0.72222222 0.36111111 0.94444444 0.55555556 0.66666667 0.80555556
0.52777778 0.5 0.58333333 0.80555556 0.86111111 1.
0.58333333 0.55555556 0.5 0.94444444 0.55555556 0.58333333
0.47222222 0.72222222 0.66666667 0.72222222 0.41666667 0.69444444
0.66666667 0.66666667 0.55555556 0.61111111 0.52777778 0.44444444]
4. 找到鸢尾属植物萼片长度的第5和第95百分位数(第1列,sepallength)。
【知识点:统计相关】
- 如何找到numpy数组的百分位数?
import numpy as np
outfile = r'iris.data'
sepallength = np.loadtxt(outfile,dtype=float,delimiter=',',usecols=[0],skiprows=1)
result = np.percentile(sepallength,[5,95])
print(result)
[4.6 7.255]
5. 把iris_data数据集中的20个随机位置修改为np.nan值。
【知识点:随机抽样】
- 如何在数组中的随机位置修改值?
import numpy as np
outfile = r'iris.data'
iris_data = np.loadtxt(outfile,dtype=object,delimiter=',')
i,j = iris_data.shape
np.random.seed(20201202)
iris_data[np.random.choice(i,size=20),np.random.choice(j,size=20)]=np.nan
print(iris_data[0:10])
[['sepallength' 'sepalwidth' 'petallength' 'petalwidth' 'species']
['5.1' '3.5' '1.4' '0.2' 'Iris-setosa']
['4.9' nan '1.4' '0.2' 'Iris-setosa']
['4.7' '3.2' '1.3' '0.2' 'Iris-setosa']
['4.6' '3.1' '1.5' '0.2' 'Iris-setosa']
['5.0' '3.6' '1.4' '0.2' 'Iris-setosa']
['5.4' '3.9' '1.7' '0.4' 'Iris-setosa']
['4.6' '3.4' '1.4' '0.3' 'Iris-setosa']
['5.0' '3.4' '1.5' '0.2' 'Iris-setosa']
['4.4' '2.9' '1.4' '0.2' 'Iris-setosa']]
np.random.choice(a)
def choice(a, size=None, replace=True, p=None)
- 表示从a中随机选取size个数
- replacement 代表的意思是抽样之后还放不放回去,如果是False的话,那么通一次挑选出来的数都不一样,如果是True的话,有可能会出现重复的,因为前面的抽的放回去了。
- p表示每个元素被抽取的概率,如果没有指定,a中所有元素被选取的概率是相等的。
np.random.randint()
numpy.random.randint(low, high=None, size=None, dtype='l')
- 函数的作用是,返回一个随机整型数,范围从低(包括)到高(不包括),即[low, high)。
- 如果没有写参数high的值,则返回[0,low)的值。
-
参数如下:
- low: int 生成的数值最低要大于等于low。 (hign = None时,生成的数值要在[0, low)区间内)
- high: int (可选) 如果使用这个值,则生成的数值在[low, high)区间。
- size: int or tuple of ints(可选) 输出随机数的尺寸,比如size = (m * n* k)则输出同规模即m * n* k个随机数。默认是None的,仅仅返回满足要求的单一随机数。
- dtype: dtype(可选):
想要输出的格式。如
int64
、int
等等
-
输出:
- out: int or ndarray of ints 返回一个随机数或随机数数组
6. 在iris_data的sepallength中查找缺失值的个数和位置(第1列)。
【知识点:逻辑函数、搜索】
- 如何在numpy数组中找到缺失值的位置?
import numpy as np
outfile = r'iris.data'
iris_data = np.loadtxt(outfile,dtype=float,delimiter=',',skiprows=1,usecols=[0,1,2,3])
i,j = iris_data.shape
np.random.seed(20201202)
iris_data[np.random.randint(i,size=20),np.random.randint(j,size=20)]=np.nan
x = iris_data[:,0]
# 查看数据类型
print(x.dtype)
# 查找缺失值
print(np.isnan(x))
# 查找缺失值的个数
y = np.isnan(x)
print('缺失值个数为:',sum(y))
# 查找缺失值的位置
print('缺失值的位置为:',np.where(y))
float64
[False False False False False False False False False False False False
False False False False False False False False False False False False
False False False False False False False False False False False False
False False False False 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 False False False False False False False
False False False False False False False True False False False False
False False False False False False False False False False False False
False False False False False True False False False False False False
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 False False True False False False False False False False
False False False False False False]
缺失值个数为: 5
缺失值的位置为: (array([ 64, 79, 101, 109, 136]),)
7. 筛选具有 sepallength(第1列)< 5.0 并且 petallength(第3列)> 1.5 的 iris_data行。
【知识点:搜索】
- 如何根据两个或多个条件筛选numpy数组?
import numpy as np
outfile = r'iris.data'
iris_data = np.loadtxt(outfile,dtype=float,delimiter=',',skiprows=1,usecols=[0,1,2,3])
speallength = iris_data[:,0]
petallength = iris_data[:,2]
index = np.where(np.logical_and(petallength > 1.5,speallength < 5.0))
print(iris_data[index])
[[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]]
- np.logical_and/or/not (逻辑与/或/非)
8. 选择没有任何 nan 值的 iris_data行。
【知识点:逻辑函数、搜索】
- 如何从numpy数组中删除包含缺失值的行?
import numpy as np
outfile = r'iris.data'
iris_data = np.loadtxt(outfile,dtype=float,delimiter=',',skiprows=1,usecols=[0,1,2,3])
i,j = iris_data.shape
np.random.seed(20201202)
iris_data[np.random.randint(i,size=20),np.random.randint(j,size=20)]=np.nan
x = iris_data[np.sum(np.isnan(iris_data),axis=1)==0]
print(x[0:10])
[[5.1 3.5 1.4 0.2]
[4.9 3. 1.4 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]
[4.6 3.4 1.4 0.3]
[5. 3.4 1.5 0.2]
[4.4 2.9 1.4 0.2]
[4.9 3.1 1.5 0.1]
[5.4 3.7 1.5 0.2]]
9. 计算 iris_data 中sepalLength(第1列)和petalLength(第3列)之间的相关系数。
【知识点:统计相关】
- 如何计算numpy数组两列之间的相关系数?
import numpy as np
outfile = r'iris.data'
iris_data = np.loadtxt(outfile,dtype=float,delimiter=',',skiprows=1,usecols=[0,1,2,3])
x = iris_data[:,0]
y = iris_data[:,1]
z = np.corrcoef(x,y)
print(z)
[[ 1. -0.10936925]
[-0.10936925 1. ]]
10. 找出iris_data是否有任何缺失值。
【知识点:逻辑函数】
- 如何查找给定数组是否具有空值?
import numpy as np
outfile = r'iris.data'
iris_data = np.loadtxt(outfile,dtype=float,delimiter=',',skiprows=1,usecols=[0,1,2,3])
x = np.isnan(iris_data)
print(np.any(x))
False
11. 在numpy数组中将所有出现的nan替换为0。
【知识点:逻辑函数】
- 如何在numpy数组中用0替换所有缺失值?
# 11
import numpy as np
outfile = r'iris.data'
iris_data = np.loadtxt(outfile,dtype=float,delimiter=',',skiprows=1,usecols=[0,1,2,3])
iris_data[np.isnan(iris_data)] = 0
print(iris_data[1:10])
[[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]
[4.6 3.4 1.4 0.3]
[5. 3.4 1.5 0.2]
[4.4 2.9 1.4 0.2]
[4.9 3.1 1.5 0.1]]
12. 找出鸢尾属植物物种中的唯一值和唯一值出现的数量。
【知识点:数组操作】
- 如何在numpy数组中查找唯一值的计数?
import numpy as np
outfile = r'iris.data'
iris_data = np.loadtxt(outfile,dtype=object,delimiter=',',skiprows=1,usecols=[4])
x = np.unique(iris_data,return_counts=True)
print(x)
(array(['Iris-setosa', 'Iris-versicolor', 'Iris-virginica'], dtype=object), array([50, 50, 50]))
13. 将 iris_data 的花瓣长度(第3列)以形成分类变量的形式显示。定义:Less than 3 --> ‘small’;3-5 --> ‘medium’;’>=5 --> ‘large’。
【知识点:统计相关】
- 如何将数字转换为分类(文本)数组?
import numpy as np
outfile = r'iris.data'
iris_data = np.loadtxt(outfile,dtype=float,delimiter=',',skiprows=1,usecols=[0,1,2,3])
petallength = iris_data[:,2]
print(np.min(petallength),np.max(petallength))
inds = np.digitize(petallength,[0,3,5,7])
# inds为petallength在bins中的位置
print(inds)
label = {1:'small',2:'medium',3:'large'}
x = [label[x] for x in inds]
print(x)
1.0 6.9
[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 2 3 3 2 2 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3]
['small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'small', 'medium', 'medium', 'medium', 'medium', 'medium', 'medium', 'medium', 'medium', 'medium', 'medium', 'medium', 'medium', 'medium', 'medium', 'medium', 'medium', 'medium', 'medium', 'medium', 'medium', 'medium', 'medium', 'medium', 'medium', 'medium', 'medium', 'medium', 'large', 'medium', 'medium', 'medium', 'medium', 'medium', 'large', 'medium', 'medium', 'medium', 'medium', 'medium', 'medium', 'medium', 'medium', 'medium', 'medium', 'medium', 'medium', 'medium', 'medium', 'medium', 'medium', 'large', 'large', 'large', 'large', 'large', 'large', 'medium', 'large', 'large', 'large', 'large', 'large', 'large', 'large', 'large', 'large', 'large', 'large', 'large', 'large', 'large', 'medium', 'large', 'medium', 'large', 'large', 'medium', 'medium', 'large', 'large', 'large', 'large', 'large', 'large', 'large', 'large', 'large', 'large', 'medium', 'large', 'large', 'large', 'large', 'large', 'large', 'large', 'large', 'large', 'large', 'large']
14. 在 iris_data 中创建一个新列,其中 volume 是 (pi x petallength x sepallength ^ 2)/ 3
。
【知识点:数组操作】
- 如何从numpy数组的现有列创建新列?
import numpy as np
outfile = r'iris.data'
iris_data = np.loadtxt(outfile,dtype=float,delimiter=',',skiprows=1,usecols=[0,1,2,3])
petallength = iris_data[:,0]
sepallength = iris_data[:,2]
volume = (np.pi * petallength * sepallength ** 2)/3
volume = volume[:,np.newaxis]
iris_data1 = np.concatenate([iris_data,volume],axis=1)
print(iris_data1[1:10])
[[ 4.9 3. 1.4 0.2 10.05728528]
[ 4.7 3.2 1.3 0.2 8.31789015]
[ 4.6 3.1 1.5 0.2 10.83849465]
[ 5. 3.6 1.4 0.2 10.262536 ]
[ 5.4 3.9 1.7 0.4 16.34256498]
[ 4.6 3.4 1.4 0.3 9.44153312]
[ 5. 3.4 1.5 0.2 11.78097245]
[ 4.4 2.9 1.4 0.2 9.03103168]
[ 4.9 3.1 1.5 0.1 11.545353 ]]
15. 随机抽鸢尾属植物的种类,使得Iris-setosa的数量是Iris-versicolor和Iris-virginica数量的两倍。
【知识点:随机抽样】
- 如何在numpy中进行概率抽样?
import numpy as np
outfile = r'iris.data'
iris_data = np.loadtxt(outfile,dtype=float,delimiter=',',skiprows=1,usecols=[0,1,2,3])
species = ['Iris-setosa','Iris-versicolor','Iris-virginica']
np.random.seed(20201202)
x = np.random.choice(species,50000,p=[0.5,0.25,0.25])
y = np.unique(x,return_counts=True)
print(y)
(array(['Iris-setosa', 'Iris-versicolor', 'Iris-virginica'], dtype='<U15'), array([24972, 12471, 12557]))
16. 根据 sepallength 列对数据集进行排序。
【知识点:排序】
- 如何按列对2D数组进行排序?
import numpy as np
outfile = r'iris.data'
iris_data = np.loadtxt(outfile,dtype=float,delimiter=',',skiprows=1,usecols=[0,1,2,3])
index = np.argsort(iris_data[:,0])
print(iris_data[index][1:10])
[[4.4 3.2 1.3 0.2]
[4.4 3. 1.3 0.2]
[4.4 2.9 1.4 0.2]
[4.5 2.3 1.3 0.3]
[4.6 3.6 1. 0.2]
[4.6 3.1 1.5 0.2]
[4.6 3.4 1.4 0.3]
[4.6 3.2 1.4 0.2]
[4.7 3.2 1.3 0.2]]
17. 在鸢尾属植物数据集中找到最常见的花瓣长度值(第3列)。
【知识点:数组操作】
- 如何在numpy数组中找出出现次数最多的值?
import numpy as np
outfile = r'iris.data'
iris_data = np.loadtxt(outfile,dtype=float,delimiter=',',skiprows=1,usecols=[0,1,2,3])
petallength = iris_data[:,2]
length,counts = np.unique(petallength,return_counts=True)
print(length[np.argmax(counts)])
print(np.max(counts))
1.5
14
18. 在鸢尾花数据集的 petalwidth(第4列)中查找第一次出现的值大于1.0的位置。
【知识点:搜索】
- 如何找到第一次出现大于给定值的位置?
import numpy as np
outfile = r'iris.data'
iris_data = np.loadtxt(outfile,dtype=float,delimiter=',',skiprows=1,usecols=[0,1,2,3])
petalwidth = iris_data[:,3]
index = np.where(petalwidth > 1.0)
print(index[0][0])
50