数据挖掘技术之变换数组的形态

在对数组进行操作时,经常要改变数组的维度。在NumPy中,常用reshape函数改变数组的“形状”,也就是改变数组的维度,其参数为一个正整数元组,分别指定数组在每个维度上的大小,reshape函数在改变原始数据的形状的同时不改变原始数据的值。如果指定的维度和数组的元素数目不相吻合,函数将抛出异常,如代码 421所示。

代码 421 改变数组形状

In[44]:

arr = np.arange(12)  #创建一维数组

print('创建的一维数组为:',arr)

Out[44]:

创建的一维数组为: [ 0  1  2  3  4  5  6  7  8  9 10 11]

In[45]:

print('新的一维数组为:',arr.reshape(3,4))  #设置数组的形状

Out[45]:

新的一维数组为: [[ 0  1  2  3]

 [ 4  5  6  7]

 [ 8  9 10 11]]

In[46]:

print('数组维度为:',arr.reshape(3,4).ndim)  #查看数组维度

Out[46]:

数组维度为: 2

在NumPy中可以使用ravel函数完成数组展平工作,如代码 422所示。

代码 422 使用ravel函数展平数组

In[47]:

arr = np.arange(12).reshape(3,4)

print('创建的二维数组为:',arr)

Out[47]:

创建的二维数组为: [[ 0  1  2  3]

 [ 4  5  6  7]

 [ 8  9 10 11]]

In[48]:

print('数组展平后为:',arr.ravel())

Out[48]:

数组展平后为: [ 0  1  2  3  4  5  6  7  8  9 10 11]

flatten函数也可以完成数组展平工作,区别在于flatten函数可以选择横向或纵向展平,如代码 423所示。

代码 423 使用flatten函数展平数组

In[49]:

print('数组展平为:',arr.flatten())  #横向展平

Out[49]:

数组展平为: [ 0  1  2  3  4  5  6  7  8  9 10 11]

In[50]:

print('数组展平为:',arr.flatten('F'))  #纵向展平

Out[50]:

数组展平为: [ 0  4  8  1  5  9  2  6 10  3  7 11]

除了可以改变数组“形状”,NumPy也可以对数组进行组合,组合方向主要有横向组合与纵向组合,使用hstack函数,vstack函数以及concatenate函数来完成数组的组合,下面将对数组组合常用的函数进行介绍。

横向组合是将ndarray对象构成的元组作为参数,传给hstack函数,如代码 424所示。

代码 424 使用hstack函数实现数组横向组合

In[51]:

arr1 = np.arange(12).reshape(3,4)

print('创建的数组1为:',arr1)

Out[51]:

创建的数组1为: [[ 0  1  2  3]

 [ 4  5  6  7]

 [ 8  9 10 11]]

In[52]:

arr2 = arr1*3

print('创建的数组2为:',arr2)

Out[52]:

创建的数组2为: [[ 0  3  6  9]

 [12 15 18 21]

 [24 27 30 33]]

In[53]:

print('横向组合为:',np.hstack((arr1,arr2)))  #hstack函数横向组合

Out[53]:

 横向组合为: [[ 0  1  2  3  0  3  6  9]

 [ 4  5  6  7 12 15 18 21]

 [ 8  9 10 11 24 27 30 33]]

纵向组合同样是将ndarray对象构成的元组作为参数,只不过传给vstack函数,如代码 425的所示。

代码 425 使用vstack函数实现数组纵向组合

In[54]:

print('纵向组合为:',np.vstack((arr1,arr2)))  #vstack函数纵向组合

Out[54]:

纵向组合为: [[ 0  1  2  3]

 [ 4  5  6  7]

 [ 8  9 10 11]

 [ 0  3  6  9]

 [12 15 18 21]

 [24 27 30 33]]

concatenate函数也可以实现数组的横向纵向组合,其中axis=1时按照横轴合并,在参数axis = 0时按照纵轴合并,如代码 426所示。

代码 426 使用concatenate函数组合数组

In[55]:

print('横向组合为:',np.concatenate((arr1,arr2),axis = 1))  #concatenate函数横向组合

Out[55]:

 横向组合为: [[ 0  1  2  3  0  3  6  9]

 [ 4  5  6  7 12 15 18 21]

 [ 8  9 10 11 24 27 30 33]]

In[56]:

print('纵向组合为:',np.concatenate((arr1,arr2),axis = 0))  #concatenate函数纵向组合

Out[56]:

纵向组合为: [[ 0  1  2  3]

 [ 4  5  6  7]

 [ 8  9 10 11]

 [ 0  3  6  9]

 [12 15 18 21]

 [24 27 30 33]]

除此之外,还可以对数组进行分割,NumPy提供hsplit、vsplit、dsplit和split函数,可以将数组分割成相同大小的子数组,也可以指定原数组中需要分割的位置。

使用hsplit函数可以对数组进行横向分割,ndarray对象构成的元组作为参数,如代码 427所示。

代码 427 使用hsplit函数实现数组横向分割

In[57]:

arr = np.arange(16).reshape(4,4)

print('创建的二维数组为:',arr)

Out[57]:

创建的二维数组为: [[ 0  1  2  3]

 [ 4  5  6  7]

 [ 8  9 10 11]

 [12 13 14 15]]

In[58]:

print('横向分割为:',np.hsplit(arr1, 2))  #hsplit函数横向分割

Out[58]:

横向分割为: [array([[ 0,  1],

       [ 4,  5],

       [ 8,  9],

       [12, 13]]), array([[ 2,  3],

       [ 6,  7],

       [10, 11],

       [14, 15]])]

使用vsplit函数可以对数组进行纵向分割,ndarray对象构成的元组作为参数,如代码 428所示。

代码 428 使用vsplit函数实现数组纵向分割

In[59]:

print('纵向分割为:',np.vsplit(arr, 2))  #vsplit函数纵向分割

Out[59]:

纵向分割为: [array([[0, 1, 2, 3],

       [4, 5, 6, 7]]), array([[ 8,  9, 10, 11],

       [12, 13, 14, 15]])]

split函数同样可以实现数组分割,在参数axis=1时,可以进行横向分割,在参数axis=0,可以进行纵向分割,如代码 429所示。

代码 429 使用split函数分割数组

In[60]:

print('横向分割为:',np.split(arr, 2, axis=1))  #split函数横向分割

Out[60]:

横向分割为: [array([[ 0,  1],

       [ 4,  5],

       [ 8,  9],

       [12, 13]]), array([[ 2,  3],

       [ 6,  7],

       [10, 11],

       [14, 15]])]

In[61:

print('纵向分割为:',np.split(arr, 2, axis=0))  #split函数纵向分割

Out[61]:

纵向分割为: [array([[0, 1, 2, 3],

       [4, 5, 6, 7]]), array([[ 8,  9, 10, 11],

       [12, 13, 14, 15]])]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知识世界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值