实验十 Numpy 库基本操作

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)  #两者答案一样

你可能感兴趣的:(python)