实验十 Numpy 库基本操作

本文介绍了如何使用NumPy进行数组操作,包括从数组中提取特定区间元素、二维数组的行列交换、查找并替换奇数、处理异常值与排序、去重、插入NaN、数据清洗与转换等。通过实例展示了在处理Iris数据集和生成图形周长方面的应用。
摘要由CSDN通过智能技术生成

1. 从数组 a=np.arange(15)提取 5 到 10 之间的所有元素

import numpy as np

a = np.arange(15)
print(a[5:11])  # 提取5到10之间的所有元素

2. 将数组 np.arange(20)转变为 4 行 5 列的二维数组,并执行交换第 1 行和第 2 行,交换第 1 列和第 2 列。

import numpy as np

a = np.arange(20).reshape(4, 5)  # 创建数组0-20,,并转化为4行5列
print("交换前:", '\n', a)

a[[0, 1], :] = a[[1, 0], :]
# [[0,1],:]表示为第一行、第二行,逗号前是表示行的参数,逗号后的表示列,冒号表示所有列
a[:, [0, 1]] = a[:, [1, 0]]
# [:,[0,1]]表示为第一列、第二列,逗号前是表示行的参数,逗号后的表示列,冒号表示所有行
print("交换后:", '\n', a)

3. 寻找数组 np.random.randint(1,10,size=(5,5))中所有的奇数,并将所有奇数替换为 0.
提示:使用 where 方法或布尔索引

import numpy as np

arr = np.random.randint(1, 10, size=(5, 5))  # 生成5×5的1~10随机数组
####使用where方法######
print("原数组:", '\n', arr)
arr[np.where(arr % 2 == 1)] = 0  # 使用where查询arr所有为奇数的值,令其=0
print("where方法转换后:", '\n', arr)
#####布尔索引####
idx = (arr % 2 == 1)  # 布尔索引 下标返回True
arr[idx] = 0  # 符合索引条件的位置 转换
print("布尔索引转换后:", '\n', arr)

4. 从下图中生成数组 a 中,替换大于等于 30 数为 0,并获取给定数组 a 中前 5 个最大值的位置。

np.random.seed(100)                            a=np.random.uniform(1,50,20)

提示:使用 np.argsort()函数

import numpy as np

np.random.seed(100)  # 指定random生成 给定随机数组
a = np.random.uniform(1, 50, 20)
idx = (a > 30)  # 利用布尔索引 获取a中>30的数的索引
a[idx] = 0  # 以>30的为索引 令其a的值=0
b = np.argsort(-a)  # 对a降序排列,返回排序后的索引值
print(a[b][:5])  # 输出以降序排列为索引的数组a的值,切片输出前5个,即为前5个最大值

5. 输出下列生成数组 a 中输出目标行,即行元素的整数部分没有重复

np.random.seed(100)                            a = np.random.uniform(1, 30, size=[6,10])

提示:np.modf() 将数组的小数和整数部分以两个独立数组的形式返回,np.unique()实现去重功能

import numpy as np

np.random.seed(100)  # 指定random生成 给定随机数组
a = np.random.uniform(1, 30, size=[6, 10])  # 生成6×10去重1~30随机数组
b = np.modf(a)  # 分离数组小数和整数部分,以两个独立数组的形式返回
c = b[1]  # 整数部分设为新的数组
print("整数部分数组:", '\n', c)
print("去重后每行元素:")
for i in range(6):
    for j in c[[i], :]:  # 每行循环
        print(np.unique(c[[i], :]))  # 每行去重

6. 利用下列方式获取数组 iris_2d

url="https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
iris_2d=np.genfromtxt(url, delimiter=',', dtype= 'float')
执行以下操作:
1) 在 iris_2d 数据集的 20 个随机位插入 np.nan 值
2) 在 iris_2d 的 sepallength(第 1 列)中查找缺失值的数量和位置
3) 过滤具有 petallength(第 3 列)> 1.5 和 sepallength(第 1 列)<5.0 的 iris_2d 的行;
4) 选择没有 nan 值的 iris_2d 数组的行
5) 找出数组 iris_2d 是否有缺失的值
6) 在 numpy 数组中用 0 替换 nan
7) 将 iris_2d 的花瓣长度(第 3 列)组成一个文本数组,如果花瓣长度为<3 则为'小',3-5 则为'中','> = 5 则为'大';
8) 在 iris_2d 中为 volume 创建一个新列,其中 volume 是(pi x
petallength x sepal_length ^ 2)/ 3;
9) 查找在 iris 数据集的第 4 列花瓣宽度中第一次出现值大于 1.0 的位置。

import numpy as np

np.random.seed(100)
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
iris_2d = np.genfromtxt(url, delimiter=',', dtype='float')

# 1),随机使得20个数值为np.nan
a, b = np.where(iris_2d)  # 取出数据坐标,a对应行,b对应列
# print(a,b)  150行,5列
iris_2d[np.random.choice((a), 20), np.random.choice((b), 20)] = np.nan
# choice(a, size=None, replace=True, p=None)

# 2),输出第一列中缺失值个数和位置
print("缺失值个数:", np.isnan(iris_2d[:, 0]).sum())
print("缺失值位置:", np.where(np.isnan(iris_2d[:, 0])))

# 3),过滤具有(第 3 列)> 1.5 和 h(第 1 列)<5.0 的 iris_2d 的行
condition = (iris_2d[:, 2] > 1.5) & (iris_2d[:, 0] < 5.0)  # 筛选条件 
print(iris_2d[condition])

# 4),选择没有 nan 值的 iris_2d 数组的行 

x = np.array([~np.any(np.isnan(row)) for row in iris_2d])
# ~为取反操作,any只要有就为true,all全部满足则为ture
# 本语句意思为,对于每一行存在nan则为true,再取反为false,表示本行不存在nan
print(iris_2d[x][:5])  # 由于每行都存在nan,数组x中没有值

# 5)  找出数组 iris_2d 是否有缺失的值 
print(np.isnan(iris_2d).any())

# 6)  在 numpy 数组中用 0 替换 nan 
iris_2d = np.where(np.isnan(iris_2d), 0, iris_2d)
print(iris_2d)

# 7)  将 iris_2d 的花瓣长度(第 3 列)组成一个文本数组,如果花瓣
# 长度为<3 则为'小',3-5 则为'中','> = 5 则为'大'; 
a1 = np.digitize(iris_2d[:, 2].astype('float'), [0, 3, 5, 10000])
tag = {1: '小', 2: '中', 3: '大'}
lst = [tag[i] for i in a1]
print(lst)

# 8)  在iris_2d中volume创建一个新列,其中volume是(pi x petallength x sepal_length ^ 2)/ 3
petallength = iris_2d[:, 2]
sepallength = iris_2d[:, 0]
volume = (np.pi * petallength * (sepallength ** 2)) / 3
print(volume)

# 9)  查找在 iris 数据集的第 4 列花瓣宽度中第一次出现值大于 1.0的位置
x = np.argmax(iris_2d[:, 3].astype('float') > 1.0)
print(x)

7.(选做) 使用 numpy 数组计算由 5 个坐标:(1,9)、(5,12)、(8,20)、(4,10)、(2,8) 构成的图形的周长。

import numpy as np

v1 = np.array([1, 9, 5, 12, 8, 20, 4, 10, 2, 8])
v2 = np.array([5, 12, 8, 20, 4, 10, 2, 8, 1, 9])
dis1 = np.sqrt(np.sum(np.square(v1 - v2)))
dis2 = np.linalg.norm(v1 - v2)
print(dis1)
print(dis2)  # 两者答案一样

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

再见以前说再见

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值