numpy库 实践

实验二 Numpy库基本操作

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

import numpy as np
a = np.arange(15)
print(a[5:10])

输出: [5 6 7 8 9]

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

import numpy as np
a = np.arange(20).reshape(4,5)
print("a:")
print(a)
a[[0,1],:] = a[[1,0],:]
print("一二行互换后的a:")
print(a)
a[:,[0,1]] = a[:,[1,0]]
print("一二列互换后的a:")
print(a)

运行: 

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

import numpy as np
a = np.random.randint(1,10,(5,5))
print("a: ")
print(a)
print("np.where(a%2==0,a,0)")
print(np.where(a%2==0,a,0))

运行: 

四、从下图中生成数组a中,替换大于等于30数为0,并获取给定数组a中前5个最大值的位置。(提示:使用np.argsort()函数)

        

import numpy as np
np.random.seed(100)
a = np.random.uniform(1,50,5)
print("a :")
print(a)
a = np.where(a>=30,0,a)
print("替换大于等于三十后的数为0,a;")
print(a)

c = np.argsort(-a)
print("c:")
print(c)
print(a[c])
print(a[c][:5])

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

print("1、在 iris_2d 数据集的 20 个随机位插入 np.nan 值\n")
np.random.seed(20221738)
iris_2d[np.random.randint(0,150,size=20),np.random.randint(0,4,size=20)]=np.nan
print(iris_2d)

"""np.random.randint(low,high,size = None ,dtype = '')
生成[low,high]区间的数,size表示个数,dtype 表示格式,默认int"""

print(" 2、在 iris_2d 的 sepallength(第 1 列)中查找缺失值的数量和位置\n")
print("Number of missing values: \n", np.isnan(iris_2d[:, 0]).sum())
print("Position of missing values: \n", np.where(np.isnan(iris_2d[:, 0])))

"""np.where(condition) 当 where 内只有一个参数时,那个参数表示条件,当条件成立时,
where 返回的是每个符合 condition 条件元素的坐标,返回的是以元组的形式"""

print("3、过滤具有 petallength(第 3 列)> 1.5 和 sepallength(第 1 列)<5.0 的 iris_2d 的行\n")
print("&运算:\n")
condition = (iris_2d[:, 2] > 1.5) & (iris_2d[:, 0] < 5.0)
print(iris_2d[condition])

"""在numpy中,&用于对两个数组的元素进行按位与运算。
因此,在条件语句中,使用and时,只能对单个元素进行逻辑运算,而使用&时,
可以对整个数组进行按位与运算。
因此,condition1 = (iris_2d[:, 2] > 1.5) and (iris_2d[:, 0] < 5.0)会报错,
而condition1 = (iris_2d[:, 2] > 1.5) & (iris_2d[:, 0] < 5.0)则可以正确执行。"""

print("and运算:\n")
condition1 = (iris_2d[:, 2] > 1.5)
condition2 =(iris_2d[:, 0] < 5.0)
for i in range(0,150):
    condition1 = (iris_2d[i, 2] > 1.5)
    condition2 = (iris_2d[i, 0] < 5.0)
    if(condition1 and condition2):
        print(iris_2d[i,:])

print("4、选择没有 nan 值的 iris_2d 数组的行:\n")

print(iris_2d[np.sum(np.isnan(iris_2d[:,:4]), axis = 1) == 0][:])

"""axis = 0 纵向
axis= 1 横向"""

print("5、找出数组 iris_2d 是否有缺失的值:\n ")
print("缺失的个数:")
for i in range(0,4):
    print("第"+str(i+1)+"列缺失的个数")
    print(sum(np.isnan(iris_2d[:, i])))

print("6、在 numpy 数组中用 0 替换 nan:\n")
r = iris_2d[:,:4]
r[np.isnan(r)] = 0
print(r)

print("7、将 iris_2d 的花瓣长度(第 3 列)组成一个文本数组,如果花瓣长度为<3 则为'小',3-5 则为'中','> = 5 则为'大: \n")
names = ('sepallength', 'sepalwidth', 'petallength', 'petalwidth', 'species')
petal_length_bin = np.digitize(iris_2d[:, 2].astype('float'), [0, 3, 5, 10])
label_map = {1: 'small', 2: 'medium', 3: 'large', 4: np.nan}
n=0
for x in petal_length_bin:
    petal_length_cat = [label_map[x]]
    n=n+1
    print(petal_length_cat[:],end="")
    if (n % 15 == 0):
        print("\n")

"""digitize(data,bins)函数执行的过程大概如下:相当于两层for循环。首先最外面的一层:顺序的遍历data列表,取出当前的一个数a,然后顺序的遍历bins列表,
返回bins列表中某个数的索引,规则如下:如果:bins列表是升序的,那么如果满足 bins[i-1]<=a<bins[i],那么就保存i,
然后回到外层循环继续上面的操作,如果bins列表是降序的,那么如果满足 bins[i]<=a<bins[i-1],那么就保存i,当data列表遍历完之后,
就返回由i组成的来源于bins的索引的一个索引列表"""

print("8、在 iris_2d 中为 volume 创建一个新列,其中 volume 是(pi xpetallength x sepal_length ^ 2)/ 3:\n")
sepallength = iris_2d[:, 0].astype('float')
petallength = iris_2d[:, 2].astype('float')
volume = (np.pi * petallength * (sepallength**2))/3
volume = volume[:, np.newaxis]
out = np.hstack([iris_2d, np.round(volume,8)])
print(out[:50])

"""为什么不能输出到150"""

"""np.newaxis的意思是给数组新增一个维度。
np.vstack():在竖直方向上堆叠
np.hstack():在水平方向上平铺"""

print("9、查找在 iris 数据集的第 4 列花瓣宽度中第一次出现值大于 1.0 的位置: \n")
print(np.argwhere(iris_2d[:, 3].astype(float) > 1.0)[0])

"""np.argwhere(a>1)
此函数要实现的功能就是,返回 Array a 中所有大于1的值的索引."""
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值