numpy

Numpy

概念

1
numPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库

###手动创建数组

1
2
3
4
5
6
7
8
9
#anaconada自带print一般不要写某些地方要写
import numpy as np
创建几维数组就是嵌套几层(手动创建除了列表元组同样可以创建)除了array\asarray同样可以创建效果一样
创建一维数组
np.array([0.243,0.246,0.32,0.345,0.231])#可以用创建一维数组
创建二维数组
np.array([[1,2,3],[2,3,4]])
创建三维数组
np.array([[[1,2,3],[3,4,5]],[[2,3,4],[4,5,6]]])

###基本指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
创建一个一维数组并且设置数据类型为浮点型
a1 = np.array([1,2,3],dtype=np.float64)
查看数组内数据类型
a1.dtype
查看数组的数据类型
type(a1) ndarray格式
数组内数据的加减乘除取商取余
a1*2\a1+2\a1*a1\a1**2等等都是对应的数据相乘相加等
数据类型修改
一方面在定义的时候直接定义数据类型
宁一方面在定以后直接强制修改
a1.astype(np.int32)
查看数组的外形
a1.shape
一维数组:返回的是元素的个数如(4,)表示元素的个数为4个 效果等同于函数len()
二维数组:返回的为数组的行数和列数(2,3) 2代表行数3代表列数
三维数组:返回的是各个维度的个数(3,2,3) 表示三维数组含有3个二维数组,每个二维数组含有2行3列
同理四维数组(2,5,2,10)#2个三维数组,每个三维数组含有5个二维数组,每个二维数组2行10列
返回一个内存对象
a1.data ====可以通过tolist转换为列表格式a1.data.tolist

###创建特殊数组

1
2
3
4
5
6
7
8
9
10
创建零数组
np.zeros((5,5))#输入行数和列数=====5行5列0数组
np.zeros_like(a1) 表示生成的零数组的行数列数同数组a1一样
创建全为1数组
np.ones((3,4))创建一个3行4列的数据
np.ones_like(a1) 创建一个数组行数和列数同a1一样
创建单位数组
np.identity(6) 创建一个6行6列的单位矩阵(对角线全为1)
创建空数组
np.empty((5,5)) 创建一个5行5列的空数组(会自动填值====占位)

###自己动生成数组

1
2
3
4
5
6
7
np.random.randint(1,100,(10,3)) 表示生成一个10行3列的矩阵,矩阵内的数据为1到100间的随机数
np.random.randint(1,100,10) 表示1到100件随机生成10个数可以通过reshape转换为数组格式
np.random.random(6) 表示随机生成6个0到1之间的小数
np.random.random((3,3)) 表示生成一个3行3列的数组,数据为0到1间的随机数
np.random.normal(4,1.2,(3,5)) 服从高斯分布(正态分布) 4表示
loc,1.2表示scale范围,(3,5)表示3行5列的矩阵
np.arange(1,13).reshape(3,4) arange先生成12个数然后在转化为3行4列的数组(记住数据要对齐)

###数组的索引和切片

1
2
3
4
5
6
7
8
9
10
一维数组的索引和切片
一维数组的索引和切片同列表的索引和切片一样,存在开始、结束和步长
test_array_1[5] test_array_1[1:5] test_array_1[-1:5:-1] test_array_1[::-1]
一维数组选区的赋值:
第一种:通过列表赋值 test_array_1[1:5]=[-1,-2,-3,-1]
第二种:选区单元赋值 test_array_1[-1:3:-1]=0 全部赋为某个值
第三种:通过数组赋值 test_array_1[2:6]=np.array([0,3,6,7])
第四种:通过元组对选区进行赋值 test_array_1[-6::-1]=(2,6,8,0,1) 或者直接去掉括号
【注意:列表切片赋值原列表不变而数组切片赋值原数组会发生变化
b = a1[2:5] b[:] = [33,45,34]====原数组会发生变化,注意[:]不能少,若加上.copy()深复制就不会改变原数组,.view()为浅复制,公用一套值.数组中切片使用时一般都要加上copy保护原数组】

1
2
3
4
5
6
7
8
9
10
11
二维数组的切片和索引
array_12[0] 表示取数组的0索引对应的行
array_12[:2] 选取0行和1行
array_12[1,2] 取索引为1那行列索引为2的数据 arry1[行索引,列索引]
array_12[1][2] 也表示取某个数据
ary1[:,1] 取全部行的列索引为1的数据
二维数组的选区和赋值(首选列表和元组,数组次之)
arr123[1:3,1:3]=[[-2,-4],[-8,-1]] 注意这里必须是嵌套列表
arr123[1:3,1:3]=((0,0),(-1,-1))
arr123[1:3,1:3]=np.array([[-2,-2],[-8,-8]])
arr123[1:3,1:3]=0
1
2
三维数组的索引和切片
a[2][3,2] 或者 a[2,3,2]
1
2
3
4
5
6
7
8
9
10
布尔值数组索引(可以选取任意行任意列)
一维布尔值数组索引
bool_matrix_col=np.array([True,True,False,True,False])
rm_1[bool_matrix_row] 只返回数组中对应True的那一行
rm_1[bool_matrix_row,2:] 返回True那一行并且对列进行限定
rm_1[:,bool_matrix_row] 返回所有行,只返回对应True的那些列
二维布尔值数组索引
(array_231<=7)&(array_231>=2) 返回数组的布尔值,符合条件的数据为True,否则为false(与符号:& 或符号:| )
array_231[(array_231<=7)&(array_231>=2)]=0 将所有符合条件的选出来并且全部赋值为指定数据
array_231[(array_231<=7)] 会将所有符合条件的数据取出按照一维数组格式
1
2
3
4
5
6
7
8
9
10
11
花式索引
第一种:
ast[[0,5,15,17,19,3]] 选取中括号内的行,并且按照0-5-15-17-19-3的顺序排列
第二种
ar_32[[1,3,0],[2,1,2]] 返回三个数据分别为行索引为1列索引为2的数据,行索引为3列索引为1数据,行索引为0列索引为2的数据
第三种
oparray_1[[1,3,5,7]][:,[0,2,3,1]] 先取数组的1,3,5,7行形成新的数组,然后取所有行,以及对应的列,列的顺序按照给定的格式0,2,3,1顺序排
亦可以用一个函数写ix_
oparray_1[np.ix_([1,3,5,7],[0,2,3,1])] 效果一样
第四种
oparray_1[:,[0,2,3,1]] 取所有行以及按照对应顺序的列

###数组的转置

1
2
3
4
5
6
实质:数组或者矩阵的转置实质就是行列转换
二维数组的转置
ar12.T
高维数组的转置(3维以及以上)当然二维也可以用transpose
arr2 = arr1.transpose((1,0,2)) 0,1,2表示维度三个表示三维,默认0,1,2(叫做轴构成对应维度空间的基础)顺序,形成的新的会按照轴的顺序进行排列
注意:可以根据轴的顺序判断数据的变化以及位置,同时也可以根据数据的变化规律推导出轴顺序.

###数组的函数计算(注意与矢量化计算的区别)

1
2
3
4
5
6
7
8
9
10
11
常用的得一元函数
np.sqrt(arr) 对数组的每一个数据都开方
np.exp(arr) 以e为底对应的幂指数
np.abs(arr) 数组中每个数据的绝对值
np.floor(ar_12) 向下取整(小的)注意复数取整向小的而不是向近的
np.ceil(ar_12) 向下取整
np.sign(ar_12) 返回数组中每个数据的符号(1和-1表示)
常用的二元函数
np.maximum(ar_13,ar_14) 两个矩阵比较形成的新矩阵数据为两个矩阵中各自为数中大的值
add,subtract,multiply,divide函数 加减乘除
np.power(ar_13,ar_14) ar_13是底,ar_14是幂 ,ar_14除了是数组也可以是一个实数

小知识:Python的八大基本数据类型
1.Number(数字)
2.String(字符串)
3.List(列表)
4.Tuple(元组)
5.Sets(集合)
6.Dictionary(字典)
7.None(空类型)
8.Object(对象类型)