Numpy数组

时间:2022-07-22
本文章向大家介绍Numpy数组,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一、NumPy简介

NumPy是针对多维数组(Ndarray)的一个科学计算(各种运算)包,封装了多个可以用于数组间计算的函数。 数组是相同数据类型的元素按一定顺序排列的组合,注意必须是相同数据类型的,比如说全是整数、全是字符串等。

array([1,2,3])                      # 数值型数组
array(['w','s','q'],dtype = '<U1')    # 字符型数组

二、NumPy 数组的生成

要使用 NumPy,要先有符合NumPy数组的数据,不同的包需要不同的数据结构,比如Pandas需要DataFrame、Series数据结构 Python中创建数组使用的是 array() 函数,array() 函数的参数可以为任何序列型对象(数组、元组、字符串等)

1.生成一般数组:array()

array():
    '''
        功能: 创建数组。
        参数: 序列型对象(数组、元组、字符串等)
        返回值: 1维或多维数组。
    '''
import numpy as np      #导包
# 给 array()函数 传入一个**列表**,直接将数据以列表的形式作为一个参数传给array()函数即可。
arr = np.array([5,4,7])
arr

# 给 array()函数 传入一个**元组**,直接将数据以元组的形式作为一个参数传给array()函数即可。
arr = np.array( (5,4,7) )
arr

# 给 array()函数 传入一个**嵌套列表**,直接将数据以嵌套列表的形式作为一个参数传给array()函数即可,这时会生成一个多维数组。
arr = np.array( [ [5,4,7],[7,8,9] ] )
arr                 #这时会生成一个多维数组

2.生成特殊类型数组

(1)生成固定范围的随机数组:arange(start,stop,step)
arange(start,stop,step):
    '''
        功能: 创建固定范围的随机数组。(生成以start开始以stop结束step为步长的随机序列)
        参数: 
            ① start: 以start开始(包括start这个值)。省略不写时,默认从0开始。
            ② stop: 以stop结束(不包括stop这个值)。
            ③ step: 步长(就是数与数之间的间隔)。省略不写时,默认为1。
        返回值: 数组。
    '''
# 和randint(low,high=None,size=None) 类似    
# 生成以1为开始,15结束,3为步长的随机序列
arr = np.arange(1,15,3)
arr
# 生成以1为开始,15结束,步长为默认值的随机序列(step不写)
arr = np.arange(1,15)
arr
# 生成以15结束,步长为默认值的随机序列。(start不写,step不写)
arr = np.arange(15)
arr
(2)生成指定形状全为0的数组:zeros()
zeros():
    '''
        功能: 生成指定形状全为0的数组
        参数: 
            传入一个具体的值时,会生成相应长度的一个全为0的1维数组。
            传入一对值时(即元组形式),会生成相应 行、列数 的全为0的多维数组。
        返回值: 全为0的 1维或多维 数组。
    '''    
# 生成长度为3的0数组
np.zeros(3)
# 生成2行3列的0数组
np.zeros((2,3))
(3)生成指定形状全为1的数组:ones()
ones():
    '''
        功能: 生成指定形状全为1的数组
        参数: 
            传入一个具体的值时,会生成相应长度的一个全为1的 1维数组。
            传入一对值时(即元组形式),会生成相应 行、列数 的全为1的 多维数组。
        返回值: 全为1的 1维或多维 数组。
    '''   
# 生成长度为3的1数组
np.ones(3)
# 生成2行3列的1数组
np.ones((2,3))
(4)生成一个正方形单位矩阵:eye()
# 单位矩阵就是对角线元素值全为1,其余位置的元素值全为0
eye():
    '''
        功能: 生成对角线元素值全为1,其余位置的元素值全为0 的 正方形矩阵
        参数: 
            传入一个具体的值(即指明正方形边长)。
        返回值: 正方形单位矩阵。
    ''' 
# 生成1个 3*3 的单位矩阵
np.eye(3)

3.生成随机数组:random 模块

随机数组的生成主要用到 NumPy 中的 random 模块。

(1)np.random.rand()
rand():
    '''
        功能: 主要用于生成 (0,1) 之间的随机数组。
        参数: 
            传入一个具体的值时,生成一个对应长度的且值位于 (0,1) 之间的随机数组。
            传入一对值时(注意这里就不是元组形式了),会生成相应 行、列数 的多维数组(且数组中的值位于 (0,1) 之间)。
        返回值: (0,1) 之间的随机数组。
    ''' 
# 生成长度为3的 值位于 (0,1) 之间的随机数组
np.random.rand(3)
# 生成2行3列的值位于 (0,1) 之间的随机数组
np.random.rand(2,3)
(2)np.random.randn()
randn():
    '''
        功能: 生成满足正态分布的指定形状数组。
        参数: 
            传入一个具体的值时,生成一个对应长度的 ma满足正态分布的随机数组。
            传入一对值时(注意这里就不是元组形式了),会生成相应 行、列数 的多维数组(且值满足正态分布)。
        返回值: 满足正态分布的指定形状数组。
    ''' 
# 生成长度为3的 值满足正态分布的随机数组
np.random.randn(3)
# 生成2行3列的 值满足正态分布 的随机数组
np.random.randn(2,3)
(3)np.random.randint()
# np.arange(start,stop,step)方法类似,用于生成一定范围内的随机数组
randint(low,high=None,size=None):
    '''
        功能: 生成一定范围内的随机数组(即在左闭右开区间生成数组大小为size的均匀分布的整数值).
        参数: 
            ① low: 以low开始(包括low这个值)。
            ② high=None: 以high结束(不包括high这个值)。有时high参数为空则取值区间为[0,low)
            ③ size=None: 可以是一个值,这时生成的随机数组是1维的,也可以是一对值(元组形式)这时就是多维的。
        返回值: 一定范围内的随机数组。
    ''' 
# 在区间为[1,5)生成长度为10的随机数组
np.random.randint(1,5,10)
# high参数为空
np.random.randint(5,size = 10) #这时你就得使用关键字参数了
# 在区间为[0,5)生成 2行3列 的随机数组
np.random.randint(5,size = (2,3))       # high参数为空,区间[0,low)
(4)np.random.choice()
choice(a,size = None,replace = None,p = None):
    '''
        功能: 从已知数组中随机选取相应大小的数组。
        参数: 
            ① a: 表示从哪个数组提取,可以是1个数组,也可以是1个整数。
                是1个数组时,表示从该数组中随机采样。
                是1个整数时,表示从range(int)中采样。
                
            ② size=None: 
                是一个具体数值时,生成1维数组;
                是一对值时(元组形式),生成多维数组。
                
            ③ replace=None: 。
            ④ p = None: 
        返回值: 数组。
    ''' 
# 从数组 a 中随机选取3个值组成一个新数组
a = np.array([1,4,7,5,6,9,8,2])
np.random.choice(a,3)

# 从数组 a 中随机选取 2行3列 组成一个新数组
np.random.choice(a,(2,3))

# 当 a 是1个整数时,随机选取3个值组成一个新数组
np.random.choice(5,3)
(5)np.random.shuffle()
shuffle():
    '''
        功能: 主要是用来将原数组顺序打乱,类似于扑克牌中的洗牌操作。
        参数: 
            目标数组
        返回值: 数组。
    ''' 
arr = np.arange(10)
arr         # 原数组顺序
# 使用shuffle()方法
np.random.shuffle(arr)  
arr         # 乱序后的数组

三、NumPy 数组的基本属性

NumPy 数组的基本属性主要包括形状、大小、类型、维数。

1.数组的形状:shape

指这个数组有几行几列数据,直接在数组后调用shape属性即可。

arr = np.array([ [1,2,3],[4,5,6],[7,8,9] ])
arr
arr.shape

2.数组的大小:size

指这个数组中总共有多少个元素,直接在数组后调用size属性即可。

arr.size

3.数组的类型:dtype

数组的类型指构成这个数组的元素都是什么类型,直接在数组后调用dtype属性即可。 在NumPy中主要有5种数据类型: ​ 类型 说明 ​ int 整型数,即整数 ​ float 浮点数,即含有小数点 ​ object Python对象类型 ​ string_ 字符串类型,经常用S表示,S10表示长度为10的字符串 ​ unicode_ 固定长度的 unicode 类型,跟字符串定义方式一样,经常用U表示

arr.dtype

4.数组的维数:ndim

指这个数组是几维空间的,几维空间就对应几维数组,直接在数组后调用ndim属性即可。

arr.ndim

arr1 = np.array([5,4,7])
arr1.ndim

四、NumPy 数组的数据选取

数据选取就是通过索引的方式把想要的某些值从全部数据中取出来。

1.一维数据选取

(1)传入某个位置

NumPy 中的位置同样从0开始计数的。正序从0开始,倒序从-1开始。

arr = np.arange(10) # 也可以写成arange(0,10,1)

# 获取第 5 位的数
arr[5]
# 获取末尾最后一个数数
arr[-1]
# 获取末尾倒数第二个数
arr[-2]
(2)传入某个位置位置:

数组中每个元素都有一个位置,若要获取某些连续位置的元素,则可以将这些元素对应的位置表示成一个区间(左闭右开),这和列表的切片相同。

# 获取位置3到5的元素
arr[3:5]
# 获取某个位置之后的所有元素
arr[3:]
# 获取某个位置之前的所有元素
arr[:3]
# 正序位置和倒序位置混用
arr[3:-2]
(3)传入某个条件
# 给数组传入某个判断条件,将返回符合该条件的元素

# 获取数组中大于3的元素
arr[ arr > 3 ]

2.多维数据选取

(1)获取某行数据
# 要获取某行数据,直接传入这行的位置(即第几行即可)。

# 获取第2行数据
arr[1]
(2)获取某些行数据
# 要获取某些行数据,直接传入这些行的位置区间即可。

# 获取第2行和第3行数据,(包含第3行)
arr[1:3]

# 获取第3行之前的所有数据,(不包含第3行)
arr[:2]

逗号之前用来指明行的位置,逗号之后用来指明列的位置,当逗号之前是个冒号时,表示获取所有行。 这个和Pandas库用法相同。

(3)获取某列数据
# 要获取某列数据,直接传入这列的位置(即第几列即可)。

# 获取 所有行 的 第2列 数据
arr[:,1]
(4)获取某些列数据
# 要获取某些列数据,直接传入这些列的位置区间即可。

# 获取 所有行 第1列到第3列数据,(不包含第3列)
arr[:,0:2]

# 同样也可以获取第3列之前的所有数据,(不包含第3列)
arr[:,:2]
# 获取第2列之后的所有数据,(包含第2列)
arr[:,1:]
(5)行列同时获取
# 分别在行位置、列位置处指明要获取行、列的位置数

# 获取第 1 到 2 行,第 2 到 3 列的数据
arr[0:2,1:3]

五、Numpy 数组的数据预处理

1.Numpy 数组的类型转换

这和Pandas理念一样,不同类型的数值可以做的运算是不一样的,所以要把我们拿到的数据转换成我们想要的数据类型。 在NumPy转换数据类型用的是 astype() ,在括号中指明要转换成的目标类型即可。

arr = np.arange(5)

# 查看数组的类型
arr.dtype           # 数据类型是 int32

# 将数组从int转换为float
arr_float = arr.astype(np.float64)
arr_float
arr_float.dtype

# 将数组从int转换为str类型
arr_str = arr.astype(np.string)
arr_str
arr_str.dtype

这个方法之前我们在Pandas也讲过,这是两个库中的两个方法,但本质是一样,Pandas中的某一列其实就是NumPy数组。

2.Numpy 数组的缺失值处理

缺失值处理处理分两步:第1步判断是否有缺失值将缺失值找出来,第2步对缺失值进行填充。 在NumPy中缺失值用 np.nan 表示。 查找缺失值用到的方法是 isnan()

isnan():
    '''
        功能: 判断是否有缺失值。
        参数: 待检测数组
        返回值: 某一位置的值为缺失值,则该位置返回True,否则返回False。
    '''
# 创建一个含有缺失值的数组
arr = np.array([5,4,np.nan,7])
arr

# 判断缺失值
np.isnan(arr)

# 用 0 填充
arr[np.isnan(arr)] = 0
arr

3.Numpy 数组的重复值处理:直接调用 unique() 方法即可

unique():
    '''
        功能: 删除重复值。
        参数: 待处理数组。
        返回值: 返回无重复值的数组。
    '''    
arr = np.array([1,2,3,2,1])

np.unique(arr)

六、Numpy 数组重塑:reshape()

所谓数组重塑就是更改数组的形状,比如将原来3行4列的数组重塑成4行3列的数组。

reshape():
    '''
        功能: 数组重塑。
        参数: 
            具体数值,转换成几行。
            具体数值,转换成几列。
        返回值: 重塑后的数组。    
    '''

1.一维数组重塑

一维数组重塑就是将数组从1行或1列数组重塑为多行多列的数组。

arr = np.arange(1,9,step=1)
arr

# 将数组重塑为 2 行 4 列的多维数组 
arr.reshape(2,4)
# 将数组重塑为 4 行 2 列的多维数组 
arr.reshape(4,2)

# 无论转换为几行几列,只要重塑后数组中值的个数等于1维数组中个数即可。

2.多维数组重塑

# 创建多维数组
arr = np.array( [ [1,2,3,4],[5,6,7,8],[9,10,11,12] ] )

# 将数组重塑为 4 行 3 列的多维数组 
arr.reshape(4,3)
# 将数组重塑为 2 行 6 列的多维数组 
arr.reshape(2,6)

# 同样,只要重塑后数组中值的个数等于1维数组中个数即可。

3.数组转置:.T

# 数组转置就是将数组的行旋转为列

arr = np.array( [ [1,2,3,4],[5,6,7,8],[9,10,11,12] ] )

arr.T

七、Numpy 数组合并

1.横向合并

横向合并就是将两个行数相等的数组在行方向上进行简单拼接。与DataFrame合并不太一样,NumPy数组合并不需要公共列,只是将两个数组简单拼接在一起,有concatenate()、hstack()、column_stack()三种方法实现。

concatenate():
    '''
        功能: 数组合并。
        参数: 
            ① 将待合并的数组以***列表***的形式传给concatenate。
            ② axis: 指明在 行方向 还是 列方向上进行合并。axis = 1,表示数组在行方向上合并;axis = 0,表示数组在列方向上合并。
        返回值: 合并后的数组。      
    '''
arr1 = np.array( [ [1,2,3],[4,5,6] ] )    
arr2 = np.array( [ [7,8,9],[10,11,12] ] )  

np.concatenate( [arr1,arr2],axis = 1 )
hstack():
    '''
        功能: 数组合并。
        参数: 
            ① 将待合并的数组以***元组***的形式传给hstack。
            # 不需要设置axis参数。
        返回值: 合并后的数组。      
    '''
np.hstack( (arr1,arr2) )    
column_stack():   
    '''
        功能: 数组合并。
        参数: 
            ① 将待合并的数组以***元组***的形式传给hstack。和hstack()方法基本一样
            # 不需要设置axis参数。
        返回值: 合并后的数组。      
    '''
np.column_stack( (arr1,arr2) )   

2.纵向合并

纵向合并是将两个列数相等的数组在列的方向上进行拼接。有concatenate()、vstack()、row_stack()三种方法实现。

np.concatenate( [arr1,arr2],axis = 0 )
vstack():       # 与hstack()相对应
    '''
        功能: 数组合并。
        参数: 
            ① 将待合并的数组以***元组***的形式传给hstack。
            # 不需要设置axis参数。
        返回值: 合并后的数组。      
    '''
np.vstack( (arr1,arr2) )    
row_stack():        # 与column_stack()相对应 
    '''
        功能: 数组合并。
        参数: 
            ① 将待合并的数组以***元组***的形式传给vstack。和vstack()方法基本一样
            # 不需要设置axis参数。
        返回值: 合并后的数组。      
    '''
np.row_stack( (arr1,arr2) )   

八、常用数据分析函数

1.元素级函数

元素级函数就是针对数组中的每个元素执行相同的函数操作,主要函数及其说明如下:

函数                          说明
abs()                           求取每个元素的绝对值
sqrt()                          求取每个元素的平方根
square()                        求取每个元素的平方
exp()                           计算每个元素的以 e 为底的指数
log()、log10()、log2()、log1p()    分别计算以 e 为底、10为底、2为底的对数,以及log(1+x)
modf()                          适用于浮点数,将小数和整数部分以独立的数组返回
isnan()                         用来判断是否是NaN,返回一个布尔值

括号里参数是待操作的数组.

arr = np.arange(4)  #np.arange(1,4,1)
# 求取各个元素的平方
np.square(arr)

# 求取各个元素的平方跟
np.sqrt(arr)

2.描述统计函数

描述统计函数就是对整个NumPy数组或某条轴的数据进行统计运算,主要函数及其说明如下:

函数                      说明
sum()                       对数组中全部元素或 某行/列的元素求和
mean()                      求平均值
std()、var()                 分别求标准差和方差
min()、max()                 最小值、最大值
argmin()、argmax()            最小值对应的索引、最大值对应的索引
cumsum()                    所有元素的累计和,结果以数组的形式返回
cumprod()                   所有元素的累计积
arr = np.array( [ [1,2,3],[4,5,6] ] )
1.求和:sum()
# 对整个数组进行求和
arr.sum()
# 对数组的每一行进行求和
arr.sum(axis = 1)
# 对数组的每一列进行求和
arr.sum(axis = 0)

2.求均值:mean()
# 对整个数组进行求均值
arr.mean()
# 对数组的每一行进行求均值
arr.mean(axis = 1)
# 对数组的每一列进行求均值
arr.mean(axis = 0)

3.求最值:
# 对整个数组进行求最大值
arr.max()
# 对数组的每一行进行求最大值
arr.max(axis = 1)
# 对数组的每一列进行求最大值
arr.max(axis = 0)

3.条件函数

where(condition,x,y):       
    '''
        功能: 
        参数: 
            ① condition: 条件。
            ② x: 符合条件返回x。
            ③ y: 符合条件返回y。
        返回值: 若条件(condition)为真则返回x,为假则返回y。      
    '''
    
arr = np.array( [55,70,99] )  
np.where(arr>60,"及格",'不及格')

# 若不写x,y,则返回满足条件的值对应的位置
np.where(arr>60)

4.集合关系

每个数组都可以当作一个集合,集合的关系就是两个数组之间的关系。

(1)包含
inld(数组1,数组2):          
    '''
        功能: 包含。
        参数: 
            ① 数组1
            ② 数组2
        返回值: 判断数组1中包含数组2中的哪些值,如果包含则在对应的位置返回True,否则返回False。      
    '''
arr1 = np.array([1,2,3,4])    
arr2 = np.array([1,2,5]) 

np.in1d(arr1,arr2)
(2)交集
intersect1d(数组1,数组2):       
    '''
        功能: 交集。
        参数: 
            ① 数组1
            ② 数组2
        返回值: 返回两个数组中的公共部分。      
    '''
np.intersect1d(arr1,arr2)    
(3)并集
union1d(数组1,数组2):       
    '''
        功能: 并集。
        参数: 
            ① 数组1
            ② 数组2
        返回值: 返回两个数组中所有的元素。      
    '''
np.union1d(arr1,arr2)    
(4)差集
setdiff1d(数组1,数组2):         
    '''
        功能: 差集。
        参数: 
            ① 数组1
            ② 数组2
        返回值: 返回在数组1中存在,但在数组2中不存在的元素。      
    '''
np.setdiff1d(arr1,arr2)