numpy是一个高性能的科学计算和数据分析基础包,在现在的数据分析领域有很多应用
跟着飞桨学习深度学习实战过程中涉及很多numpy的知识,整理学习笔记打卡记录
常用的创建方法是使用numpy中的array方法
import numpy as np
a=np.array([1,2,3])
在这里首先进行正常的导入包,使用as重命名为np,方便调用
随后使用array方法,传入了一个列表,创建一个一维数组【1,2,3】赋值给变量a
同样的,我们可以改变参数值的列表数量创建高维数组
a=np.array([1,2,3],[4,5,6])
这里默认import语句的作用范围是全文的,所以下文不再重复引用
在这里我们传入两个列表,所以创建了一个两行三列的二维数组。赋值给a
对于全零或者全一等特殊数组,我们可以使用numpy提供的方法直接创建
np.ones([2,3]) #使用ones(维度)方法创建一个两行三列的全1数组,默认浮点数类型
np.zeros([3,4]) #使用zeros(维度)方法创建一个3行4列的全0数组
a=np.empty([2,3]) #使用empty(维度)方法创建一个2行3列的随机值数组
b=np.empty([3,4])
c=np.empty([4,5])
最后三行分别创建了三个二维数组,理论上内部是随机值,但是我们输出之后会发现一个很有趣的现象,数组a全是1.,数组b全是0,只有数组c是随机数,这里就涉及python内存调用的关系,在已经储存了满足维度要求的数组时,就不再产生随机数组,而是直接调用,比如第一行我们创建了维数【2,3】的全1.数组,再次要求创建维数【2,3】的随机数组时,就不会再创建,直接调用了第一行的结果,同样的,b赋值也是直接调用了第二行的全零数组,只有c赋值时,前文没有创建【4,5】维数的数组,才会生成随机数数组
既然是属性,所以下面提到的这些是直接用“·”操作符获取而不用加括号的,不要和常用的方法记混。
返回数组维度,即二维数组返回 2,三维数组返回3
返回数组维数,或者说是形状也行,2行3列就是(2,3)
返回数组元素个数
返回元素类型,默认用array创建时不声明类型就是默认浮点数,或者可以用dtype=np.int32等缺省参数声明类型
返回元素字节大小计算方法是类型位数除以8,比如类型是float64,那元素字节就是64/8=8,如果是int32,那就是32/8=4
a=np.array([1,2,3],[4,5,6])
print(a.ndim) #输出2
print(a.shape) #输出(2,3)
print(a.size) #输出6
print(a.dtype) #输出dtype(‘float64’)
print(a.itemsize) #输出8
a=np.ones([2,3],dtype=np.int32) # 规定数据类型为int32
print(a.dtype) # 输出dtype(‘int32’)
print(a.itemsize) # 输出4
可以通过print直接打印
数组能够直接进行加减乘除运算,对应的结果是数组中对应位置元素的加减乘除结果
a=np.array([1,2,3])
b=np.array([4,5,6])
print(a+b)
print(a-b)
print(a*b)
print(a/b)
对于矩阵来说,虽然表达形式上和多维数组相似,但是意义不同,矩阵也不存在除法运算,乘法运算的机制也不一样,即点积,用dot方法实现 ,而对于数组与常数(或者称之为标量)的加减乘除运算,也是直接对应个位置元素和常数的加减乘除运算
a=np.array([1,2,3])
b=np.array([4,5,6])
c=a.dot(b)
print(c)
print(1+a)
print(a-1)
print(a*2)
print(a/2)
三者都可以参数传入axis=0或者1指定行或者列,0的时候计算每一列,1的时候计算每一行;
三者都是np的方法,操作的数组作为参数传入,下面可以结合示例理解一下
d=np.array([[1,2,3],[4,5,6],[7,8,9]])
print(d.min())
print(d.min(axis=0))
print(d.min(axis=1))
print(d.max())
print(d.sum())
print(d.sum(axis=0))
print(np.exp(d))
print(np.sqrt(d))
print(np.square(d))
这个随机数组就是真正意义的随机了,不像empty方法会重复利用内存
np.random.seed(42)
print(np.random.rand(2,3))
print(np.random.randn(2,3))
print(np.random.randint(1,10))
print(np.random.binomial(6,1))
print(np.random.beta(2,3))
print(np.random.normal(2,3))
对于一维数组来说,索引的相关操作和列表类似,对于高维数组来说,索引的参数个数拓展到多维,比如对一维数组a[0:4]这个操作就是输出前四个数,那么二维数组就要拓展到a[0:2,1:3]这个操作就是对于第一维(行)0:2选取前两行,对于第二维(列)1:3选取第1,2列,就相当于只选取了前两行的1,2列这四个元素
结合运行结果理解一下
对于迭代来说二维数组会有两层for循环,这时我们可以用数组的flat方法使其扁平化,
for i in d:
for ii in i:
print(ii)
#以上操作等同于扁平化在一维操作
for i in d.flat:
print(i)
注意扁平化之后是一个迭代器,而不是直接的一维数组,所以不能够直接进行数组的操作