杨桃的Python进阶讲座18——数组array(八)如何从一维数组扩展为二维数组以及再次降为一维数组

本人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!

 

发布了55 篇原创文章 · 获赞 16 · 访问量 6111

猜你喜欢

转载自blog.csdn.net/yty_7/article/details/104871312
今日推荐