Numpy函数应用
了解数组对象可以调用哪些方法。
随机数
- np.random.random(),括号内不传参数,产生为[0,1)内的随机数;传入的参数为形状的时候,产生形状的随机数组。
- np.random.randint(),括号内传入的参数为(起始值,终止值,size=(形状))
- np.random.randn(),括号内传入的为形状,产生均值为0,方差为1的正态分布的随机数组
- np.random.normal(),括号内传入的参数为(均值,方差,size=(形状))
- np.random.rand(),括号内传入的为形状,生成[0,1)内随机数的数组
np.random.randn()
np.random.normal()
np.random.rand()
用随机数生成的数据一直在变化,可以利用seed()来固定生成的数据,括号里不传内容,数据还是随机改变,传入数字,每个数组代表生成一组固定的数据。
所有的随机数,其实是伪随机的,是通过种子计算出来的,可以用特定的种子固定一组随机数,也可以跟时间绑定,每过一秒就产生一组随机数,也可以跟时间戳进行绑定。时间不同,生成的数组也是随机的。
所有的随机数,其实是伪随机的,是通过种子计算出来的,可以用特定的种子固定一组随机数。种子的范围在0—2**32-1 范围之间。
对数组进行随机排序,行的顺序发生变化,不会对原数组产生变化
随机数组,是从已知列表中选取数据,可以重复选取
也可以在已知数据中随机选取数字,或者在指定数字范围内随机取数。
数据拼接
上下拼接
上下拼接时,用vstack(),括号内是要拼接的数组的集合,跟数组所在的前后顺序有关,放在前面的数组,拼接时在新数组的上方。多维数组可以跟一维数组进行拼接,要保证列数必须相同,拼接后是完整的矩形。
左右拼接
左右拼接用hstack(),同样跟数组所在的前后顺序有关。
数组转置与换轴
● arr.transpose() # 转置,方法
● arr.T # 转置,属性
● arr.swapaxes() # 换轴,只限定于二维数组
取对角线
合并
np.concatenate(),里面的axis参数不传,默认为0,为行合并;为1时为列合并
数组分割
可以分为左右分割,上下分割,要注意分割的时候要能均分,不要4列数组分割成3列。
数组广播
广播机制规则:如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符或其中一方的长度为1,则认为他们是广播兼容的。广播会在缺失和(或)长度为1的维度上进行。
数组可以跟常数、数组进行运算。
数组跟常数进行加减乘除运算时,可以视为把常数向右、向下广播为数组的形状,对应数据进行运算。
数组与数组进行加减乘除运算,对应位置数据进行运算。当运算数组不一致时,会在缺少的方向上进行广播,3行8列的数组与1行8列的数组进行运算的时候,1行8列的数组会在行的方向上进行广播成3行,两个数组形状相同时,对应数据进行运算。同样列方向上也能进行广播.
1行8列的数组和8行1列的数组进行运算,各自进行行广播和列广播,直至两个数组形状相同时,再进行运算,得到8行8列的数组。
三维数组的运算,运算时按照广播机制规则,从末尾的维度进行判断,出现相同的数据或者为1的,才可以进行计算。
通用函数
一元函数
只需要传一个参数。
函数 | 描述 |
---|---|
np.abs | 绝对值 |
np.sqrt | 开根 |
np.square | 平方 |
np.exp | 计算指数(e^x) |
np.log,np.log10,np.log2,np.log1p | 求以e为底,以10为底,以2为底,以(1+x)为底的对数 |
np.ceil | 向上取整,比如5.1会变成6,-6.9会变成-6 |
np.floor | 向下取整,比如5.9会变成5,-6.1会变成-7 |
np.rint,np.round | 四舍六入五成偶 |
np.modf | 将整数和小数分隔开来形成两个数组 |
np.isnan() | 判断是否是nan,缺失值,括号内传数组 |
np.isinf() | 判断是否是inf,无穷大,括号内传数组 |
np.cos,np.cosh,np.sin,np.sinh,np.tan,np.tanh | 三角函数 |
INF和NAN
inf代表是无穷数,-inf代表负无穷,默认是浮点型,没有意义,任何数跟inf运算,得到的都为inf,在计算时会想办法清理掉,两个inf相等。
nan为缺失值,没有数据是空的,默认浮点型,任何数跟nan运算,得到的都为nan,两个nan不相等。
二元函数
需要传2个参数
函数 | 描述 |
---|---|
np.add | 加法运算(即1+1=2),相当于+ |
np.subtract | 减法运算(即3-2=1),相当于- |
np.negative | 负数运算(即-2),相当于加个负号 |
np.multiply | 乘法运算(即2x3=6),相当于x |
np.divide | 除法运算(即3/2=1.5),相当于/ |
np.floor_divide | 取整运算,相当于// |
np.mod | 取余运算,相当于% |
greater,greater_equal,less,less_equal,equal,not_equal | >,>=,<,<=,=,!=的函数表达式 |
logical_and | &的函数表达式 |
logical_or | \ |
聚合函数
方法 | 描述 |
---|---|
sum | 沿着轴向计算所有元素的累和,0长度的数组,累和为0 |
mean | 数学平均,0长度的数组平均值为NaN |
max,min | 最大值和最小值 |
argmax,argmin | 最大值和最小值的位置 |
std,var | 标准差和方差 |
ptp | 极值 |
cumsum | 从0开始元素累积和 |
median | 中值 |
布尔数组函数
排序函数
添加删除函数
操作后对原数组没有改变。这里使用了append、delete、insert函数。
不可变数据对象
不可变数据类型:整型,浮点型,布尔型,字符串、元组。不可变类型修改变量的值,进行重新赋值的时候,不能在内存地址上去修改,会重新开辟内存地址,创建一个新的数据对象。
比如定义两个变量并进行赋值(赋值其实为对象的引用),a = 999,b = a,这个时候输出a,b,均为999。a=999,意味着在内存地址中开辟了一块内存空间存放数据999,这是一块地址,以后为了使用这块地址上的数据999,就起了一个名称a,如果用到这个数据的话,就通过变量名a找到这块内存地址上的数据,变量名指向的是内存地址。b = a,可以用id(a),id(b)去查看,两个变量所指向同一块内存地址,所以内存地址是一样的。好比兄弟二人的家
如果,a = 999,b = 999,通过id()去查看,发现两个变量的内存地址是不一样的,只不过是数据是一样的。相当于两个变量分别开辟了内存地址。好比两家的装修风格一样,但地址不一样。
可变数据对象
可变数据类型:列表,字典,集合。修改变量的值是在原有的内存地址上修改的.
python数据对象的深浅拷贝
浅拷贝
只拷贝第一层的数据作为副本,从下图可以看到,拷贝后 两个列表的数据一样,但内存地址不一样,而两个列表中嵌套的列表,内容和内存地址都一样。
内层列表更改时,两个列表都进行了更改,说明只拷贝了内层列表的内存列表的地址,两个列表是独立的对象,但是它们的子对象指向同一个对象。
深拷贝
完全拷贝,所有层次的数据,完完全全复制数据对象,两个列表是完全独立的个体。拷贝了内层列表的数据内容,而非内存地址了。
Numpy数组对象的深浅拷贝
- 浅拷贝:内存地址
- 深拷贝:数据内容
数组对象的掩码操作
掩码即为掩盖真实的操作,取值的时候传递进来的不再是索引,而是布尔数据对象。
datas[fruits == ‘pear’] 就为布尔索引,相当于把 fruits == ‘pear’ 的结果对应到 datas的每一行,为True的保留。
花哨索引
[,]作为索引时,实际上是[行,列],逗号前是对行的操作,后为对列的操作。
数组运算和矩阵运算
数组运算是数组中各元素进行运算;矩阵与单位矩阵相乘,得到的是矩阵本身。
Numpy的应用—图像处理
对图像的操作其实是对数据的操作,在代码文件夹下放入图片 demo.jpg。
练习题
- reshape(),resize(),flatten(),shape()中不能修改数组对象维度的是:(shape())。
shape()是属性,并不是方法,用来查看数组形状的。 reshape(),resize()直接更改数组形状,flatten()是多维转换为一维。 - np.random.seed(100),Z=np.random.uniform(0,1,10)找到数组中离0.5最近的值
- a = np.random.randint(1,10,[5,3]),按照行求最大值和最小值相除的结果。
- a = np.arange(15).reshape(3,5),将二维数组的行和列分别进行逆序。
- a = np.zeros((2,2),设置一个数组不能修改值()
答案:a.setflags(write=False) 或者 a.flags.writeable = False
- a = np.arange(12).reshape(3,4),创建两个结构相同的数据,元素分布为0和1
- a = np.arange(12,dtype=float).reshape(3,4),把里面的元素都改为字符串.
答案:字符串:a.astype(‘str’),改为整型:a.astype(‘int’)
- 求解方程 x-2y+z = 0;2y-8z = 8;-4x+5y+9z = -9