欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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创建单位矩阵

python基础知识打卡第十六天

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,相当于占位符,系统可以自动帮忙算几列

python基础知识打卡第十六天

# 将二维变一维
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]])