Numpy 学习专题(十)—— 大作业

大作业

本次练习使用 鸢尾属植物数据集.\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]

import numpy as np
import pandas as pd
np.set_printoptions(suppress=True)  # 取消科学计数法显示

# 1.导入同时存在数字和文本的数据集
iris = pd.read_csv('iris.csv', usecols=[1, 2, 3, 4, 5])
# 转换成numpy数组形式
columns_name = iris.columns  # ['Sepal.Length', 'Sepal.Width', 'Petal.Length', 'Petal.Width', 'Species']
iris_array = np.array([[iris[columns_name[0]][i], iris[columns_name[1]][i], iris[columns_name[2]][i],
                        iris[columns_name[3]][i]] for i in range(len(iris[columns_name[0]]))])

# 2.求出鸢尾属植物萼片长度(Sepal.Length)的平均值、中位数和标准差
d = iris['Sepal.Length']
d_mean = np.mean(d)
# print(d_mean)  # 5.843333333333334
d_median = np.median(d)
# print(d_median)  # 5.8
d_std = np.std(d)
# print(d_std)  # 0.8253012917851409

# 3.创建一种标准化形式的鸢尾属植物萼片长度,其值正好介于0和1之间(Sepal.Length)
d_normalize = (d-d.min())/(d.max()-d.min())
# print(d_normalize)

# 4.找到鸢尾属植物萼片长度(Sepal.Length)的第5和第95百分位数
d_5, d_95 = np.percentile(d, [5, 95])
# print(d_5, d_95)  # 4.6 7.254999999999998

# 5.把iris_data数据集中的20个随机位置修改为np.nan值
np.random.seed(20201201)
id_x = np.random.randint(0, len(iris_array), size=20)
id_y = np.random.randint(0, len(iris_array[0]), size=20)
id = np.array([[id_x[i], id_y[i]] for i in range(len(id_x))])
# print(id)  # 随机点坐标
for idx in id:
    iris_array[idx[0]][idx[1]] = np.nan
# print(iris_array)  # 修改后的数据

# 6.在iris_data的(Sepal.Length)中查找缺失值的个数和位置
d_new = iris_array[:, 0]
# np.isnan(d_new):返回矩阵,nan元素返回值为True
nan_num = np.sum([1 for i in np.isnan(d_new) if i == True])
# print(nan_num)  # 3
nan_id = [i for i in range(len(d_new)) if np.isnan(d_new)[i] == True]
# print(nan_id)  # [95, 101, 144]

# 7.筛选具有 Sepal.Length< 5.0 并且 Petal.Length> 1.5 的 iris_data行
qualified_data = np.array([iri for iri in iris_array if iri[0] < 5.0 and iri[2] > 1.5])
# print(qualified_data)

# 8.选择没有任何 nan 值的 iris_data行
flag_array = np.isnan(iris_array)  # 返回矩阵,nan元素返回值为True
nan_id = []  # 找出 nan 的行的索引
for i in range(len(flag_array)):
    if np.isin(True, flag_array[i]):  # 该行有缺失值
        nan_id.append(i)
nan_id = np.array(nan_id)
iris_array_no_non = np.delete(iris_array, nan_id, axis=0)  # 删除有 nan 的行
# print(iris_array)  # 输出没有任何 nan 值的 iris_data行

# 9.计算 iris_array 中Sepal.Length(第1列)和Petal.Length(第3列)之间的相关系数
sepal_length = iris_array_no_non[:, 0]
petal_length = iris_array_no_non[:, 2]
cor = np.corrcoef(sepal_length, petal_length)
# print(cor)  # 输出相关系数矩阵
# [[ 1.         -0.14424092]
#  [-0.14424092  1.        ]]

# 10.找出iris_data是否有任何缺失值
# print(nan_id)  # 输出有 nan 的行的索引

# 11.在numpy数组中将所有出现的nan替换为0
iris_array[np.isnan(iris_array)] = 0
# print(iris_array)

# 12.找出鸢尾属植物物种中的唯一值和唯一值出现的数量
from collections import Counter
iris_one = iris_array.reshape(1, len(iris_array)*4)[0]  # 降维,降维1维
num = Counter(iris_one)  # 唯一值统计
# print(num)  # 输出唯一值及其出现的数量

# 13.将 iris_data 的花瓣长度(Petal.Length)以形成分类变量的形式显示
# 定义:Less than 3 --> 'small';3-5 --> 'medium';'>=5 --> 'large'
petal = iris_array[:, 2]
bins = np.array([0.0, 3.0, 5.0, np.max(petal)])  # 分段点
inds = np.digitize(petal, bins)  # 产生分段结果
labels = {1: 'small', 2: 'medium', 3: 'large', 4: np.nan}
petal_kinds = [labels[x] for x in inds]  # 添加标签
# print(np.array(petal_kinds))

# 14. 在 iris_data 中创建一个新列,其中 volume 是 (pi x petallength x sepallength ^ 2)/ 3
new_parameter = [np.pi * iris_array[:, 0][i] * iris_array[:, 2][i] for i in range(len(iris_array[:, 0]))]
iris_array = np.column_stack([iris_array, new_parameter])  # 向numpy数组中添加列
# print(iris_array)

# 15.随机抽鸢尾属植物的种类,使得Iris-setosa的数量是Iris-versicolor和Iris-virginica数量的两倍。
kinds = ['Iris‐setosa', 'Iris‐versicolor', 'Iris‐virginica']
np.random.seed(20201201)
random_results = np.random.choice(kinds, 10000, p=[0.5, 0.25, 0.25])  # 概率抽样

# 16. 根据 Sepal.Length 列对数据集进行排序
id_speal = np.lexsort([iris_array[:, 0]])  # 按第1列递增的顺序对每行排序
ir = iris_array[id_speal]

# 17. 在鸢尾属植物数据集中找到最常见的花瓣长度值(第3列)
petal_len, counts = np.unique(iris_array[:, 2], return_counts=True)
# print(petal_len[np.argmax(counts)])  # 出现次数最多的花瓣
# print(np.argmax(counts))  # 出现次数

# 18. 在鸢尾花数据集的 petalwidth(第4列)中查找第一次出现的值大于1.0的位置
idxs = np.where(iris_array[:, 3] > 1.0)[0][0]
# print(idxs)
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值