python基础知识打卡第十六天
程序员文章站
2024-01-20 09:32:28
...
Numpy的基本使用
本部分参考链接 Numpy——通往人工智能的大门
1、Numpy的核心特征就是N-维数组对——ndarray
1.1、ndarray-创建
ndarray常用的创建方法如下表:
方法 | 描述 |
---|---|
array() | 将列表转换为数组,可选择显式指定dtype |
arange() | range的numpy版,支持浮点数 |
linspace() | 类似arange(),第三个参数为数组长度 |
zeros() | 根据指定形状和dtype创建全0数组 |
ones() | 根据指定形状和dtype创建全1数组 |
empty() | 根据指定形状和dtype创建空数组(随机值) |
eye() | 根据指定边长和dtype创建单位矩阵 |
1.2、ndarray的常用属性
属性 | 描述 |
---|---|
T | 数组的转置(对高维数组而言) |
dtype | 数组元素的数据类型 |
size | 数组元素的个数 |
ndim | 数组的维数 |
shape | 数组的维度大小(以元组形式) |
itemsize | 每个项占用的字节数 |
nbytes | 数组中的所有数据消耗掉的字节数 |
# T:转置 转置是一种特殊的数据重组形式,可以返回底层数据的视图而不需要复制任何内容。
# 通俗点说,转置就是将数据旋转90度,行变成列,列变成行。
li1 = [
[1,2,3],
[4,5,6]
]
a = np.array(li1)
a.T
执行结果:
array([[1, 4],
[2, 5],
[3, 6]])
# dtype:返回当前数据的数据类型
arr = np.arange(10)
arr.dtype
执行结果:
dtype('int32')
# size:返回当前数组内存在的元素个数
l1 = [[[1,2,3],
[4,5,6]],
[[7,8,9],
[1,5,9]
]]
arr1 = np.array(l1)
arr1.size
执行结果:
12
# ndim:返回当前数组维度
l1 = [[[1,2,3],
[4,5,6]],
[[7,8,9],
[1,5,9]
]]
arr1 = np.array(l1)
arr1.ndim
执行结果:
3
# shape:返回数组维度大小
l1 = [[[1,2,3,4],
[4,5,6,5],
[6,8,3,6]],
[[7,8,9,7],
[1,5,9,7],
[4,6,8,4]
]]
arr1 = np.array(l1)
arr1.shape
执行结果:
(2, 3, 4)
"""
最终三个参数代表的含义依次为:二维维度,三维维度,每个数组内数据大小
要注意这些数组必须要是相同大小才可以
"""
1.3、ndarray的常用数据类型 dtype
类型 | 描述 |
---|---|
布尔型 | bool_ |
整型 i | nt_ int8 int16 int32 int 64 |
无符号整型 | uint8 uint16 uint32 uint64 |
浮点型 | float_ float16 float32 float64 |
'''整型:
int32只能表示(-2**31,2**31-1),因为它只有32个位,只能表示2**32个数
无符号整型:
只能用来存正数,不能用来存负数'''
"""
补充:
astype()方法可以修改数组的数据类型
示例:
data.astype(np.float)
"""
1.4、索引和切片
一维索引使用与python本身的列表没有任何区别,所以接下来主要针对大的是多维数组.
- 索引
# np重塑
arr = np.arange(30).reshape(5,6) # 后面的参数6可以改为-1,相当于占位符,系统可以自动帮忙算几列
# 将二维变一维
arr.reshape(30)
# 索引使用方法
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23],
[24, 25, 26, 27, 28, 29]])
#现在有这样一组数据,需求:找到20
#列表写法:arr[3][2]
#数组写法:arr[3,2] # 中间通过逗号隔开就可以了
- 切片
切片不会拷贝,直接使用的原视图,如果硬要拷贝,需要在后面加.copy()方法。
#arr数组
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23],
[24, 25, 26, 27, 28, 29]])
arr[0,1:4] # >>array([1, 2, 3]) 0在前表示第0行,从第一列开始,一直到第3列,即第1,2,3列
arr[1:4,0] # >>array([ 6, 12, 18]) 0在后表示第0列,从第一行开始,一直到第三行,即第1,2,3行
arr[::2,::2] #行和列都从零开始,步长为2,获取0,2,4行和0,2,4列
# >>array([[ 0, 2, 4],
# [12, 14, 16],
# [24, 26, 28]])
arr[:,1] #第一列上全部索引
# >>array([ 1, 7, 13, 19, 25])
- 配合省略号的使用
切片还可以包括省略号 …,来使选择元组的长度与数组的维度相同。 如果在行位置使用省略号,它将返回包含行中元素的 ndarray。
import numpy as np
a = np.array([[1,2,3],[3,4,5],[4,5,6]])
print (a[...,1]) # 第2列元素
print (a[1,...]) # 第2行元素
print (a[...,1:]) # 第2列及剩下的所有元素
# 》》结果:
[2 4 5]
[3 4 5]
[[2 3]
[4 5]
[5 6]]
- 布尔索引
给一个数组,选出数组种所有大于5的数。
li = [random.randint(1,10) for _ in range(30)]
a = np.array(li)
a[a>5]
执行结果:
array([10, 7, 7, 9, 7, 9, 10, 9, 6, 8, 7, 6])
---------------------------------------------
原理:
a>5会对a中的每一个元素进行判断,返回一个布尔数组
a > 5的运行结果:
array([False, True, False, True, True, False, True, False, False,
False, False, False, False, False, False, True, False, True,
False, False, True, True, True, True, True, False, False,
False, False, True])
----------------------------------------------
布尔型索引:将同样大小的布尔数组传进索引,会返回一个有True对应位置的元素的数组
- 常见通用函数
一元函数:
函数 | 功能 |
---|---|
abs、fabs | 分别是计算整数和浮点数的绝对值 |
sqrt | 计算各元素的平方根 |
square | 计算各元素的平方 |
exp | 计算各元素的指数e**x |
log | 计算自然对数 |
sign | 计算各元素的正负号 |
ceil | 计算各元素的ceiling值 |
floor | 计算各元素floor值,即小于等于该值的最大整数 |
rint | 计算各元素的值四舍五入到最接近的整数,保留dtype |
modf | 将数组的小数部分和整数部分以两个独立数组的形式返回,与Python的divmod方法类似 |
isnan | 判断数组中的缺失值 |
isinf | 表示那些元素是无穷的布尔型数组 |
cos,sin,tan | 普通型和双曲型三角函数 |
二元函数:
函数 | 功能 |
---|---|
add | 将数组中对应的元素相加 |
subtract | 从第一个数组中减去第二个数组中的元素 |
multiply | 数组元素相乘 |
divide、floor_divide | 除法或向下圆整除法(舍弃余数) |
power | 对第一个数组中的元素A,根据第二个数组中的相应元素B计算A**B |
maximum,fmax | 计算最大值,fmax忽略NAN |
miximum,fmix | 计算最小值,fmin忽略NAN |
mod | 元素的求模计算(除法的余数) |
浮点数有两个特殊值:
注意:
①、nan(Not a Number):不等于任何浮点数(nan != nan)
②、inf(infinity):比任何浮点数都大
- 数学统计方法
函数 | 功能 |
---|---|
sum | 求和 |
cumsum | 求前缀和 |
mean | 求平均数 |
std | 求标准差 |
var | 求方差 |
min | 求最小值 |
max | 求最大值 |
argmin | 求最小值索引 |
argmax | 求最大值索引 |
- 随机数
在numpy中也有一个随机数生成函数,它在np.random的子包当中。在Python自带的random当中只能生成一些简单、基础的随机数,而在np.random当中是可以生成一些高级的随机数的。np.random要比Python自带的random包更加灵活。
函数 | 功能 |
---|---|
rand | 返回给定维度的随机数组(0到1之间的数) |
randn | 返回给定维度的随机数组 |
randint | 返回给定区间的随机整数 |
choice | 给定的一维数组中随机选择 |
shuffle | 原列表上将元素打乱(与random.shuffle相同) |
uniform | 给定形状产生随机数组 |
seed | 设定随机种子(使相同参数生成的随机数相同) |
standard_normal | 生成正态分布的随机样本数 |
# rand 返回给定维度的随机数组
np.random.rand(2,2,2)
> array([[[0.37992696, 0.18115096],
[0.78854551, 0.05684808]],
[[0.69699724, 0.7786954 ],
[0.77740756, 0.25942256]]])
-------------------------------------------------------------------------
# randn 返回给定维度的随机数组
np.random.randn(2,4)
> array([[ 0.76676877, 0.21752554, 2.08444169, 1.51347609],
[-2.10082473, 1.00607292, -1.03711487, -1.80526763]])
-------------------------------------------------------------------------
# randint 返回给定区间的随机整数
np.random.randint(0,20)
> 15
-------------------------------------------------------------------------
# chocie 给定的一维数组中随机选择
np.random.choice(9,3) # # 从np.range(9)中,(默认)有放回地等概率选择三个数
> array([5, 8, 2])
np.random.choice(9,3,replace=False) # 无放回地选择
> array([1, 2, 0])
------------------------------------------------------------------------
# shuffle 原列表上将元素打乱(与random.shuffle相同)
arr = np.arange(10)
np.random.shuffle(arr)
arr
> array([4, 5, 0, 3, 7, 8, 9, 1, 2, 6])
------------------------------------------------------------------------
# uniform 给定形状产生随机数组
np.random.uniform(0,1,[3,3,3])
> array([[[0.80239474, 0.37170323, 0.5134832 ],
[0.42046889, 0.40245839, 0.0812019 ],
[0.8788738 , 0.48545176, 0.73723353]],
[[0.79057724, 0.80644632, 0.65966656],
[0.43833643, 0.53994887, 0.46762885],
[0.44472436, 0.08944074, 0.34148912]],
[[0.7042795 , 0.58397044, 0.13061102],
[0.22925123, 0.97745023, 0.14823085],
[0.6960559 , 0.07936633, 0.91221842]]])
------------------------------------------------------------------------
# seed 设定随机种子(使相同参数生成的随机数相同)
np.random.seed(0) # 当seed(0)时生成以下随机数组
np.random.rand(5)
> array([0.5488135 , 0.71518937, 0.60276338, 0.54488318, 0.4236548 ])
np.random.seed(2) # send(5)时生成以下随机数组
np.random.rand(5)
> array([0.5488135 , 0.71518937, 0.60276338, 0.54488318, 0.4236548 ])
np.random.seed(0) # 再次使用send(0)会发现返回最开始的随机数组
np.random.rand(5)
> array([0.5488135 , 0.71518937, 0.60276338, 0.54488318, 0.4236548 ])
------------------------------------------------------------------------
# standard_normal 生成正态分布的随机样本数
np.random.standard_normal([2,10])
> array([[-0.17937969, -0.69277058, 1.13782687, -0.16915725, -0.76391367,
-0.4980731 , -0.36289111, 0.26396031, -0.62964191, -0.4722584 ],
[-1.51336104, 1.10762468, 0.17623875, -0.94035354, 0.92959433,
-1.06279492, -0.88640627, 1.92134696, -0.45978052, -1.08903444]])