本人CSDN博客专栏:https://blog.csdn.net/yty_7
Github地址:https://github.com/yot777/
用reshape()函数将一维数组升维成二维数组
首先我们由一个列表转换为NpArray数组:
>>> import numpy as np
>>> s=[1,2,3,4,5] #原始列表s
>>> ss1=np.array(s) #将列表s(包含全部元素)转换为NpArray
>>> print(ss1)
[1 2 3 4 5]
>>> ss2=np.array(s[:]) #将列表s(包含全部元素)转换为NpArray
>>> print(ss2)
[1 2 3 4 5]
>>> ss3=np.array(s[1:4]) #将s从索引1到4-1=3的元素转换为NpArray
>>> print(ss3)
[2 3 4]
这时候的ss1是一维数组,第一维包含5个元素
>>> np.shape(ss1)
(5,)
>>> ss1.shape[0] #ss1是一维数组,因此只有shape[0]的值
5
>>> len(ss1) #一维数组的长度就是shape[0]的值(即元素个数)
5
然后将ss1扩展为二维数组,怎么做呢?用reshape()函数就行,注意用法:
>>> sss1 = ss1.reshape((1,ss1.shape[0])) #注意reshape函数有两个括号!
#reshape((x,y))表示构成一个x行y列的新数组
#这里的x=1, y= ss1.shape[0]表示将ss1在原样基础上再增加一个维度
>>> print(sss1)
[[1 2 3 4 5]]
用矩阵的观点来看,sss1现在就形成了一个1行5列(1X 5)矩阵
因此我们shape一下sss1可以看到:
>>> np.shape(sss1)
(1, 5)
>>> sss1.shape[0] #对于二维数组,shape[0]表示第二维的元素个数
1
>>> sss1.shape[1] #对于二维数组,shape[1]表示第一维的元素个数
5
>>> len(sss1) #对于二维数组,len()函数表示第二维的元素个数
1
>>> len(sss1[0])
5
还可以使用np.squeeze()函数获得二维数组的各种行、列切片,如下:
>>> print(np.squeeze(sss1[0]))
[1 2 3 4 5]
>>> print(np.squeeze(sss1[:,0]))
1
>>>
>>> print(np.squeeze(sss1[:,2]))
3
>>>
>>> print(np.squeeze(sss1[:,:3]))
[1 2 3]
和之前我们讲过的规则一样:
二维数组的索引,如果[]以数字或者单冒号开头,表示取行元素。
二维数组的索引,如果[]以冒号逗号(:,)开头,表示取列元素。
用np.vstack()函数将扩充二维数组
使用np.vstack()函数往已有的二维数据添加第二维度的数据(可以理解为矩阵添加行)
>>> import numpy as np
>>> print(sss1)
[[1 2 3 4 5]]
>>> sss1=np.vstack([sss1,[6,7,8,9,10]])
>>> print(sss1)
[[ 1 2 3 4 5]
[ 6 7 8 9 10]]
>>> np.shape(sss1)
(2, 5)
>>> sss1.shape[0]
2
>>> sss1.shape[1]
5
>>> len(sss1)
2
>>> len(sss1[0])
5
用矩阵的观点来看,sss1现在就形成了一个2行5列(2 X 5)矩阵
再次使用np.squeeze()函数:
>>> print(np.squeeze(sss1[0]))
[1 2 3 4 5]
>>> print(np.squeeze(sss1[1]))
[ 6 7 8 9 10]
>>> print(np.squeeze(sss1[0:2]))
[[ 1 2 3 4 5]
[ 6 7 8 9 10]]
>>> print(np.squeeze(sss1[:,0:2]))
[[1 2]
[6 7]]
>>> print(np.squeeze(sss1[:,4]))
[ 5 10]
用reshape()函数将二维数组降维成一维数组
如何把二维数组sss2再变回一维数组?同样使用reshape()函数:
>>> sss1.shape[0] #sss1数组的行数
2
>>> sss1.shape[1] #sss1数组的列数
5
>>> sss2=sss1.reshape((sss1.shape[0]*sss1.shape[1]))
# 即sss2=sss1.reshape((10))
>>> print(sss2)
[ 1 2 3 4 5 6 7 8 9 10]
如果是:
sss2.reshape((10,1)) #形成一个10行1列的二维数组
array([[ 1],
[ 2],
[ 3],
[ 4],
[ 5],
[ 6],
[ 7],
[ 8],
[ 9],
[10]])
>>> sss2.reshape((5,2)) #形成一个5行2列的二维数组
array([[ 1, 2],
[ 3, 4],
[ 5, 6],
[ 7, 8],
[ 9, 10]])
可见,reshape()函数可以实现升维、降维,以及对同维度的数组改变行列数的操作。
需要注意的是,同维度的数组改变行列数一定要有合理性,比如一个(3, 4)的数组可以用reshape()函数改为(2,6)或者(6,2)或者(12,1)或者(1,12),但是无法改成行数为5的数组。
特例:二维向量变成一个一维向量的超简便方法,直接写reshape((-1))
注意-1是用两对括号包起来的:
>>> sss2=sss1.reshape((-1))
>>> print(sss2)
[ 1 2 3 4 5 6 7 8 9 10]
reshape((-1))也有两个参数的写法:
>>> sss3=sss1.reshape((1,-1))
>>> print(sss3)
[[ 1 2 3 4 5 6 7 8 9 10]]
>>> sss4=sss1.reshape((-1,1))
>>> print(sss4)
[[ 1]
[ 2]
[ 3]
[ 4]
[ 5]
[ 6]
[ 7]
[ 8]
[ 9]
[10]]
可见,reshape((-1))是Python自动计算的原二维数组的所有元素个数,这样用也行:
>>> sss5=sss1.reshape((-1,2))
>>> print(sss5)
[[ 1 2]
[ 3 4]
[ 5 6]
[ 7 8]
[ 9 10]]
总之,reshape((m,n))是将二维数组重新划分为m行n列:
如果n缺失成为reshape((m)),就是一个一维向量。
reshape((-1)):原二维数组的所有元素组成的一个一维向量
reshape((-1,n)):行数是原二维数组的所有元素个数除以n的值,列数为n
reshape((m,-1)):行数是m,列数是原二维数组的所有元素个数除以m的值
总结
reshape()函数既可以将一维数组升维成二维数组,也可以将二维数组降维成一维数组,以及对同维度的数组改变行列数的操作。
使用np.vstack()函数往已有的二维数据添加第二维度的数据(可以理解为矩阵添加行)。
reshape((m,n))是将二维数组重新划分为m行n列:
如果n缺失成为reshape((m)),就是一个一维向量。
reshape((-1)):原二维数组的所有元素组成的一个一维向量
reshape((-1,n)):行数是原二维数组的所有元素个数除以n的值,列数为n
reshape((m,-1)):行数是m,列数是原二维数组的所有元素个数除以m的值
本人CSDN博客专栏:https://blog.csdn.net/yty_7
Github地址:https://github.com/yot777/
如果您觉得本篇本章对您有所帮助,欢迎关注、评论、点赞!Github欢迎您的Follow、Star!