05-Numpy函数应用

本文介绍了Numpy的np.random模块,包括设置随机数种子、生成均匀分布和正态分布的随机数、整数随机数、从序列中随机选择以及数组的洗牌操作。此外,还讲解了Numpy的数组计算、排序、聚合函数和文件操作,如保存和读取CSV文件,以及独特的数组广播机制。
摘要由CSDN通过智能技术生成

np.random模块

np.random为我们提供了许多获取随机数的函数。这里统一来学习一下。

np.random.seed:

用于指定随机数生成时所用算法开始的整数值,如果使用相同的seed()值,则每次生成的随即数都相同,如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间差异而不同。一般没有特殊要求不用设置。以下代码:

np.random.seed(1)
print(np.random.rand()) # 打印0.417022004702574
print(np.random.rand()) # 打印其他的值,因为随机数种子只对下一次随机数的产生会有影响。

np.random.rand:

生成一个值为[0,1)之间的数组,形状由参数指定,如果没有参数,那么将返回一个随机值。示例代码如下:

data1 = np.random.rand(2,3,4) # 生成2块3行4列的数组,值从0-1之间
data2 = np.random.rand() #生成一个0-1之间的随机数

np.random.randn:

生成均值(μ)为0,标准差(σ)为1的标准正态分布的值。示例代码如下:

data = np.random.randn(2,3) #生成一个2行3列的数组,数组中的值都满足标准正太分布

np.random.randint:

生成指定范围内的随机数,并且可以通过size参数指定维度。示例代码如下:

data1 = np.random.randint(10,size=(3,5)) #生成值在0-10之间,3行5列的数组
data2 = np.random.randint(1,20,size=(3,6)) #生成值在1-20之间,3行6列的数组

np.random.choice:

从一个列表或者数组中,随机进行采样。或者是从指定的区间中进行采样,采样个数可以通过参数指定:

data = [4,65,6,3,5,73,23,5,6]
result1 = np.random.choice(data,size=(2,3)) #从data中随机采样,生成2行3列的数组
result2 = np.random.choice(data,3) #从data中随机采样3个数据形成一个一维数组
result3 = np.random.choice(10,3) #从0-10之间随机取3个值

np.random.shuffle:

把原来数组的元素的位置打乱。示例代码如下:

a = np.arange(10)
np.random.shuffle(a) #将a的元素的位置都会进行随机更换

更多:

更多的random模块的文档,请参考Numpy的官方文档:https://docs.scipy.org/doc/numpy/reference/routines.random.html

通用函数

一元函数:

在这里插入图片描述

二元函数:

在这里插入图片描述

聚合函数:

在这里插入图片描述

使用np.sum或者是a.sum即可实现。并且在使用的时候,可以指定具体哪个轴。同样Python中也内置了sum函数,但是Python内置的sum函数执行效率没有np.sum那么高,可以通过以下代码测试了解到:

a = np.random.rand(1000000)
%timeit sum(a) #使用Python内置的sum函数求总和,看下所花费的时间
%timeit np.sum(a) #使用Numpy的sum函数求和,看下所花费的时间

布尔数组的函数:

在这里插入图片描述

比如想看下数组中是不是所有元素都为0,那么可以通过以下代码来实现:

np.all(a==0) 
# 或者是
(a==0).all()

比如我们想要看数组中是否有等于0的数,那么可以通过以下代码来实现:

np.any(a==0)
# 或者是
(a==0).any()

排序:

  1. np.sort:指定轴进行排序。默认是使用数组的最后一个轴进行排序。

     a = np.random.randint(0,10,size=(3,5))
     b = np.sort(a) #按照行进行排序,因为最后一个轴是1,那么就是将最里面的元素进行排序。
     c = np.sort(a,axis=0) #按照列进行排序,因为指定了axis=0
    

    还有ndarray.sort(),这个方法会直接影响到原来的数组,而不是返回一个新的排序后的数组。

  2. np.argsort:返回排序后的下标值。示例代码如下:

     np.argsort(a) #默认也是使用最后的一个轴来进行排序。
    
  3. 降序排序:np.sort默认会采用升序排序。如果我们想采用降序排序。那么可以采用以下方案来实现:

     # 1. 使用负号
     -np.sort(-a)
    
     # 2. 使用sort和argsort以及take
     indexes = np.argsort(-a) #排序后的结果就是降序的
     np.take(a,indexes) #从a中根据下标提取相应的元素
    

其他函数补充:

  1. np.apply_along_axis
    

    :沿着某个轴执行指定的函数。示例代码如下:

     # 求数组a按行求均值,并且要去掉最大值和最小值。
     np.apply_along_axis(lambda x:x[(x != x.max()) & (x != x.min())].mean(),axis=1,arr=a)
    
  2. np.linspace
    

    :用来将指定区间内的值平均分成多少份。示例代码如下:

     # 将0-1分成12分,生成一个数组
     np.linspace(0,1,12)
    
  3. np.unique
    

    :返回数组中的唯一值。

     # 返回数组a中的唯一值,并且会返回每个唯一值出现的次数。
     np.unique(a,return_counts=True)
    
    

更多:

https://docs.scipy.org/doc/numpy/reference/index.html

数组广播机制:

数组与数的计算:

Python列表中,想要对列表中所有的元素都加一个数,要么采用map函数,要么循环整个列表进行操作。但是NumPy中的数组可以直接在数组上进行操作。示例代码如下:

import numpy as np
a1 = np.random.random((3,4))
print(a1)
# 如果想要在a1数组上所有元素都乘以10,那么可以通过以下来实现
a2 = a1*10
print(a2)
# 也可以使用round让所有的元素只保留2位小数
a3 = a2.round(2)

以上例子是相乘,其实相加、相减、相除也都是类似的。

数组与数组的计算:

  1. 结构相同的数组之间的运算:

    a1 = np.arange(0,24).reshape((3,8))
    a2 = np.random.randint(1,10,size=(3,8))
    a3 = a1 + a2 #相减/相除/相乘都是可以的
    print(a1)
    print(a2)
    print(a3)
    
  2. 与行数相同并且只有1列的数组之间的运算:

    a1 = np.random.randint(10,20,size=(3,8)) #3行8列
    a2 = np.random.randint(1,10,size=(3,1)) #3行1列
    a3 = a1 - a2 #行数相同,且a2只有1列,能互相运算
    print(a3)
    
  3. 与列数相同并且只有1行的数组之间的运算:

    a1 = np.random.randint(10,20,size=(3,8)) #3行8列
    a2 = np.random.randint(1,10,size=(1,8))
    a3 = a1 - a2
    print(a3)
    

广播原则:

如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符或其中一方的长度为1,则认为他们是广播兼容的。广播会在缺失和(或)长度为1的维度上进行。。看以下案例分析:

  1. shape(3,8,2)的数组能和(8,3)的数组进行运算吗?
    分析:不能,因为按照广播原则,从后面往前面数,(3,8,2)(8,3)中的23不相等,所以不能进行运算。
  2. shape(3,8,2)的数组能和(8,1)的数组进行运算吗?
    分析:能,因为按照广播原则,从后面往前面数,(3,8,2)(8,1)中的21虽然不相等,但是因为有一方的长度为1,所以能参与运算。
  3. shape(3,1,8)的数组能和(8,1)的数组进行运算吗?
    分析:能,因为按照广播原则,从后面往前面数,(3,1,4)(8,1)中的41虽然不相等且18不相等,但是因为这两项中有一方的长度为1,所以能参与运算。

文件操作

操作CSV文件:

文件保存:

有时候我们有了一个数组,需要保存到文件中,那么可以使用np.savetxt来实现。相关的函数描述如下:

np.savetxt(frame, array, fmt='%.18e', delimiter=None)
* frame : 文件、字符串或产生器,可以是.gz或.bz2的压缩文件
* array : 存入文件的数组
* fmt : 写入文件的格式,例如:%d %.2f %.18e
* delimiter : 分割字符串,默认是任何空格

以下是使用的例子:

a = np.arange(100).reshape(5,20)
np.savetxt("a.csv",a,fmt="%d",delimiter=",")

读取文件:

有时候我们的数据是需要从文件中读取出来的,那么可以使用np.loadtxt来实现。相关的函数描述如下:

np.loadtxt(frame, dtype=np.float, delimiter=None, unpack=False)
* frame:文件、字符串或产生器,可以是.gz或.bz2的压缩文件。
* dtype:数据类型,可选。
* delimiter:分割字符串,默认是任何空格。
* skiprows:跳过前面x行。
* usecols:读取指定的列,用元组组合。
* unpack:如果True,读取出来的数组是转置后的。

np独有的存储解决方案:

numpy中还有一种独有的存储解决方案。文件名是以.npy或者npz结尾的。以下是存储和加载的函数。

  1. 存储:np.save(fname,array)np.savez(fname,array)。其中,前者函数的扩展名是.npy,后者的扩展名是.npz,后者是经过压缩的。
  2. 加载:np.load(fname)

CSV文件操作:

读取csv文件:

import csv

with open('stock.csv','r') as fp:
    reader = csv.reader(fp)
    titles = next(reader)
    for x in reader:
        print(x)

这样操作,以后获取数据的时候,就要通过下表来获取数据。如果想要在获取数据的时候通过标题来获取。那么可以使用DictReader。示例代码如下:

import csv

with open('stock.csv','r') as fp:
    reader = csv.DictReader(fp)
    for x in reader:
        print(x['turnoverVol'])

写入数据到csv文件:

写入数据到csv文件,需要创建一个writer对象,主要用到两个方法。一个是writerow,这个是写入一行。一个是writerows,这个是写入多行。示例代码如下:

import csv

headers = ['name','age','classroom']
values = [
    ('zhiliao',18,'111'),
    ('wena',20,'222'),
    ('bbc',21,'111')
]
with open('test.csv','w',newline='') as fp:
    writer = csv.writer(fp)
    writer.writerow(headers)
    writer.writerows(values)

也可以使用字典的方式把数据写入进去。这时候就需要使用DictWriter了。示例代码如下:

import csv

headers = ['name','age','classroom']
values = [
    {"name":'wenn',"age":20,"classroom":'222'},
    {"name":'abc',"age":30,"classroom":'333'}
]
with open('test.csv','w',newline='') as fp:
    writer = csv.DictWriter(fp,headers)
    writer.writerow({'name':'zhiliao',"age":18,"classroom":'111'})
    writer.writerows(values)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值