Numpy 官方文档:https://docs.scipy.org/doc/numpy/user/index.html
创建ndarray
ndarray,是Numpy的核心数据结构,元素的数据类型由dtype(data-type)对象来指定,每个ndarray只有一种dtype类型 ,ndarray的大小固定,创建好数组后数组大小是不会再发生改变的。
np.array(list、tuple) 将python序列转换成数组
字典dict转成ndarray的话是当做其中一个值来使用,无法正常转换
直接创建ndarray
np.zeros() 创建全0数组 np.zeros(3)、np.zeros([3,4])。
np.ones() 全1数组,float类型的1。
np.empty() 空数组,未初始化,数值不确定。
其他创建方式
arange() 类似python的range函数,通过指定开始值、终值和步长来创建一个一维数组,注意:最终创建的数组不包含终值
np.arange(0,100) 生成一个一维数组,0-99的数值。arange默认是从0开始的,所以可以写成 np.arange(100)
np.arange(0,100,2) 步长为2,生成0/2/4/6/8.../98 的数组
np.arange(100,0,-2) 步长为-2
np.arange(0,100,2.5) 步数可以是float
linspace(start,end,num) 生成等差数列,生成num个数值的数组
logspace(num1,num2,total,base) 生成等比数列,base的num1次方到base的num2次方,生成total个数值的数组
random() 生成随机数数组
np.random.random([3,3]) 创建0-1之间的随机元素,数组包含的元素数量由参数决定
np.random.randint(0,2,[10,10]) 左闭右开 不包括2,0或者1数值的10*10的数组
np.random.randn(num) 正态分布数组
对象属性
ndim 数组轴个数
shape 维度,数组的形状
size 元素总个数
dtype 数据类型
itemsize 每个元素的字节大小
数据类型 dtype
创建数组的时候可以显示设置dtype,不设置会自动根据内容生成dtype类型
np.array(list,dtype="int8") 创建的时候可以设置数据类型
创建好数组之后,不能修改数据类型
但可以通过astype 复制新数组设置新的数据类型
数据类型 | 类型简写 | 说明 |
int_ |
| 默认整形 |
intc |
| 等价于long的整形 |
int8 | i1 | 字节整形,1个字节,范围:[-128,127] |
int16 | i2 | 整形,2个字节,范围:[-32768,32767] |
int32 | i4 | 整形,4个字节,范围:[-2^31, 2^31-1] |
int64 | i8 | 整形,8个字节,范围:[-2^63, 2^63-1] |
uint8 | u1 | 无符号整形, 1个字节, 范围:[0,255] |
uint16 | u2 | 无符号整形, 2个字节, 范围:[0,65535] |
uint32 | u4 | 无符号整形, 1个字节, 范围:[0, 2^32-1] |
uint64 | u8 | 无符号整形, 1个字节, 范围:[0,2^64-1] |
bool_ |
| 以一个字节形成存储的布尔值(True或者False) |
float_ |
| float64简写形式 |
float16 | F2 | 半精度浮点型(2字节):1符号位+5位指数+10位的小数部分 |
float32 | f4或者f | 单精度浮点型(4字节):1符号位+8位指数+23位的小数部分 |
float64 | f8或者d | 双精度浮点型(8字节):1符号位+11位指数+52位的小数部分 |
complex_ | c16 | complex128的简写形式 |
complex64 | c8 | 复数,由两个32位的浮点数来表示 |
complex128 | c16 | 复数,由两个64位的浮点数来表示 |
object | O | Python对象类型 |
String_ | S | 固定长度的字符串类型(每个字符1个字节),比如:要创建一个长度为8的字符串,应该使用S8 |
Unicode_ | U | 固定长度的unicode类型的字符串(每个字符占用字节数由平台决定),长度定义类似String_类型 |
修改形状
arr.shape=(2,6) 直接修改shape值修改形状
arr2=arr1.reshape(2,-1) 通过reshape修改形状,-1自动计算
arr2=arr1.reshape(-1) 降为 一维
基本操作
数值运算,矢量化运算
数组+-/*数值:每个值都做运算
元素级操作
如果两个数组的形状相同,那么会是对于位置元素的运算
arr1+arr2如下运算过程
广播的原则
广播的原则:如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符,或其中的一方的长度为1,则认为它们是广播兼容的。广播会在缺失和(或)长度为1的维度上进行。
这句话乃是理解广播的核心。广播主要发生在两种情况,一种是两个数组的维数不相等,但是它们的后缘维度的轴长相符,另外一种是有一方的长度为1。
arr1(5,7)+-/*arr2(5,1) 每一行的每个值都会和arr2对于行数的数组运算
arr = np.arange(35)
arr1 = np.reshape(arr,[5,-1])
print(arr1)
arr2=[
[1],
[2],
[3],
[4],
[5]]
print(arr2)
arr1+arr2
输出结果
[[ 0 1 2 3 4 5 6] [[1],
[ 7 8 9 10 11 12 13] [2],
[14 15 16 17 18 19 20] + [3],
[21 22 23 24 25 26 27] [4],
[28 29 30 31 32 33 34]] [5]]
每一行广播相加对应行的值
=array([[ 1, 2, 3, 4, 5, 6, 7],
[ 9, 10, 11, 12, 13, 14, 15],
[17, 18, 19, 20, 21, 22, 23],
[25, 26, 27, 28, 29, 30, 31],
[33, 34, 35, 36, 37, 38, 39]])
arr1(5,7)+-/*arr2(1,7) 对每一列进行操作,可以写成arr2(7),会自动广播成arr2(1,7),后缘维度相同即可
arr = np.arange(35)
arr1 = np.reshape(arr,[5,-1])
print(arr1)
arr2=[1,2,3,4,5,6,7]
print(arr2)
arr1+arr2
输出结果
[[ 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 30 31 32 33 34]]
+
[1, 2, 3, 4, 5, 6, 7]
=
[[ 1, 3, 5, 7, 9, 11, 13],
[ 8, 10, 12, 14, 16, 18, 20],
[15, 17, 19, 21, 23, 25, 27],
[22, 24, 26, 28, 30, 32, 34],
[29, 31, 33, 35, 37, 39, 41]])
矩阵积
第一个数组的行=第二个数组的列 arr1(m,n) dot arr2(n,k) = arr3(m,k)
使用方法 np.dot(arr1,arr2)
数组索引
数组下角标arr[2][2],-1 代表最后一个。
简写 arr[2,2] numpy自带索引方式,每个维度用逗号隔开
切片操作
在各维度上单独切片,如果某维度都保留,则使用:冒号,不指定初始值和终止值。
切出来的是子视图,对子视图的修改,会直接影响原数组
花式索引
数组=arr(6,6)
1、获取1,3,4行
arr[[0,2,3]]
2、获取第一列和最后一列
arr[:,[0,-1]]
3、获取第1,3行和第2,4
arr[[0,2]][:,[1,3]] # 先取到行,然后再切所有行的指定列
arr[[0,2]].T[[1,3]].T #先取行,转置再取行,再转置
也可以使用 np.ix_()索引器
arr[np.ix_([0,2],[1,3])]
arr[[0,2],[1,3]] 是错误的,获取到的是0,1数据和2,3数据,只有两个值
花式索引得到的子集数组是一个新的数组,修改新数组数据不会影响原数据。
布尔索引
找数组中的偶数
condition=arr%2==0,
arr[condition]
数组arr会降为成一维数组
数组中值大于20并且是偶数(&且 |或)
arr[(arr%2==0) & (arr>20)]
按行列放布尔索引,arr[[行布尔索引],[列布尔索引]]
arr[[True,False,True,False,False,False],[False,True,False,False,False,False]]
索引结果:第1和3行的第2列,两个数值组成的数组
数组转置与轴对换
转置:行列转换
arr.T
三维转置 arr(2,3,4),arr.T为(4,3,2) 值怎么放?
transpose()轴对换
arr(2,3,4)
arr.transpose() #默认是转置操作,也就是2,1,0
arr.transpose(1,2,0) #指定对换轴,(3,4,2)
数组拉伸
np.tile(arr,rep),rep是拉伸的倍数
横向拉伸
arr(5,3)
np.tile(arr,2) 横向拉伸2倍
纵向拉伸
np.tile(arr,[2,1]) 纵向拉伸2倍。0轴*2,1轴*1
数组合并
vstack 垂直合并
arr1(5,3)与arr2(9,3)
np.vstack([arr1,arr2]) #垂直堆叠两个数组,变成arr(14,3)
hstack水平合并
arr1(5,3)与arr2(5,2)
np.hstack([arr1,arr2]) #水平堆叠,变成arr(5,5)
stack 沿着新的轴进行数据合并,会拓展出一个新轴
arr1(3,5) arr2(3,5)
np.stack([arr1,arr2],axis=0) 变成 arr(2,3,5)
np.stack([arr1,arr2],axis=1) 变成 arr(3,2,5)
np.stack([arr1,arr2],axis=2) 变成 arr(3,5,2)