持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情
1.编译环境及库包要求
1.python3.X
2.jupyter note
3.Numpy库
2.数组形状变换函数
2.1 np.reshape
我们先从最常用的np.reshape进行了解学习:
np.reshape(a,newshape,order='C')
2.1.1 np.reshape的参数
1.其中a代表的是变换前的数组。
2.newshape是用来指定数组变换后的shape
(需注意:如果它指定的是int型,那么变换后得到包含所指定元素个数的一维数组;
如果指定的是元组或者列表类型,则作为变换后的shape进行指定)
3.order根据指定的模式读取索引并对数组进行重塑。
np.reshape返回经过形状变换后得到的ndarray,在np.reshape的参数中,第一个参数指定变换前的ndarray,第二个参数指定数组变换后的形状(shape),最后的第三个参数很少用可以忽略~ 在对数组的shape进行指定时,如果使用类似(n,-1)这样包含-1的形状,函数就会自动匹配元素的数量,输出n*m的二维数组。这里的m是根据原有数组的元素数量自动匹配得到的值,因此保证了变形前数组元素的数量与变形后的元素数量是一致的。
import numpy as np
a=np.arange(12)#创建一个一维数组
a
b=np.reshape(a,(4,3))#变形为4*3的二维数组
b
这里我们将原本12个元素的ndarray对象作为第一个参数,第二个参数newshape指定为(3,4),就可以将其转换成4×3的多维数组。变形前的ndarray中的元素与变形后的ndarray中的元素是共享的。所以我们对变形后的某个值进行修改,会导致变形前的值同时被修改。
b[0,1]=0
b,a
如果变形前的元素数量与变形后的元素数量不一致,就意味着指定的参数不正确,因此就会导致报错。针对此类问题,我们可以指定-1,函数就会自动根据原有数组的元素数量设置适当的变形值。
但是我们将shape指定为(n,-1),就会得到n×m(m是自动匹配到的值)的数组。
np.reshape(a,(3,-1)),np.reshape(a,(-1,6))#自动生成3×4和2×6的数组
2.1.3 np.arange
np.arange具有与np.reshape完全相同的功能。
a=np.arange(12).reshape((3,4))
b=np.arange(12).reshape((-1,6))#也可以使用-1
a,b
2.2 np.resize
接下来学习与np.reshape具有相同功能的np.resize函数
np.resize(a,newshape)
2.2.1 np.resize参数
1.其中a代表的是变换前的数组。
2.newshape是用来指定数组变换后的shape
(需注意:如果它指定的是int型,那么变换后得到包含所指定元素个数的一维数组;
如果指定的是元组或者列表类型,则作为变换后的shape进行指定)
np.resize返回经过形状变换后得到的ndarray与np.reshape是一样的,只不过它的参数不包含order。此外,当变形后的数组与变形前的数组的元素数量不一致时,其行为是不同的。使用np.reshape函数进行变换时,变形前与变形后的元素数量不一致,会导致运行时错误发生,而使用np.resize函数进行变换时,变形前后的元素数量不一致并不会导致运行时错误发生,程序会强制执行代码。
在这里我们分析一下np.resize函数在当前数组的尺寸大于元素数量时,原有的元素会被重复利用。而np.reshape函数就会报错。
在np.resize函数中当数组的尺寸小于元素数量时,原有的元素不会全部被使用,而np.reshape函数就会报错。
另外还有一点不同,我们之前说了np.reshape函数变换之后内存是发生改变的,元素是共享内存的。而np.resize函数元素不会共享内存,也就是说即使对变形后数组中的某个值进行修改,也不会导致变形前的值同时被修改。
a=np.arange(12)
b=np.resize(a,(3,4))#变换为三行四列
b[0,1]=100#修改数组中的元素
b,a#分别输出b和a
b[0,1]指的是第一行第二列的那个元素。
3.归纳总结
1.np.reshape函数在变形前后的数组元素不一样的时候会出现运行错误,而且元素的变更会影响原来的元素。
2.np.resize函数在变形前后的数组元素不一样的时候不会出现运行错误,元素的变更不会影响原来的元素。