• 【NumPy学习指南】day5 改变数组的维度


    我们已经学习了怎样使用reshape函数,现在来学习一下怎样将数组展平。
    (1) ravel 我们可以用ravel函数完成展平的操作:
    In: b
    Out:
    array([[[ 0, 1, 2, 3],
    [ 4, 5, 6, 7],
    [ 8, 9,10,11]],
    [[12,13,14,15],
    [16,17,18,19],
    [20,21,22,23]]])
    In: b.ravel()
    Out:
    array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
    17, 18, 19, 20, 21, 22, 23])
    (2) flatten 这个函数恰如其名,flatten就是展平的意思,与ravel函数的功能相同。
    不过,flatten函数会请求分配内存来保存结果,而ravel函数只是返回数组的一个视图(view):
    In: b.flatten()
    Out:
    array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
    17, 18, 19, 20, 21, 22, 23])
    (3) 用元组设置维度 除了可以使用reshape函数,我们也可以直接用一个正整数元组来设
    置数组的维度,如下所示:
    In: b.shape = (6,4)
    In: b
    Out:
    array([ 0, 1, 2, 3],
    [ 4, 5, 6, 7],
    [ 8, 9,10,11],
    [12,13,14,15],
    [16,17,18,19],
    [20,21,22,23]],
    正如你所看到的,这样的做法将直接改变所操作的数组,现在数组b成了一个6×4的多维数组。
    (4) transpose 在线性代数中,转置矩阵是很常见的操作。对于多维数组,我们也可以这样做:
    In: b.transpose()
    Out:
    array([[ 0, 4, 8, 12, 16, 20],
    [ 1, 5, 9, 13, 17, 21],
    [ 2, 6,10, 14, 18, 22],
    [ 3, 7,11, 15, 19, 23]])
    (5) resize resize和reshape函数的功能一样,但resize会直接修改所操作的数组:
    In: b.resize((2,12))
    In: b
    Out:
    array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
    [12,13,14,15,16,17,18,19,20,21, 22, 23]])
    刚才做了些什么
    我们用ravel、flatten、reshape和resize函数对NumPy数组的维度进行了修改。
    动手实践:组合数组
    首先,我们来创建一些数组:
    In: a = arange(9).reshape(3,3)
    In: a
    Out:
    array([[0, 1, 2],
    [3, 4, 5],
    [6, 7, 8]])
    In: b = 2 * a
    In: b
    Out:
    array([[ 0, 2, 4],
    [ 6, 8, 10],
    [12, 14,16]])
    (1) 水平组合 我们先从水平组合开始练习。将ndarray对象构成的元组作为参数,传给
    hstack函数。如下所示:
    In: hstack((a, b))
    Out:
    array([[ 0, 1, 2, 0, 2, 4],
    [ 3, 4, 5, 6, 8,10],
    [ 6, 7, 8,12,14,16]])
    我们也可以用concatenate函数来实现同样的效果,如下所示:
    In: concatenate((a, b), axis=1)
    Out:
    array([[ 0, 1, 2, 0, 2, 4],
    [ 3, 4, 5, 6, 8,10],
    [ 6, 7, 8,12,14,16]])

    (2) 垂直组合 垂直组合同样需要构造一个元组作为参数,只不过这次的函数变成了
    vstack。如下所示:
    In: vstack((a, b))
    Out:
    array([[ 0, 1, 2],
    [ 3, 4, 5],
    [ 6, 7, 8],
    [ 0, 2, 4],
    [ 6, 8,10],
    [12,14,16]])
    同样,我们将concatenate函数的axis参数设置为0即可实现同样的效果。这也是axis参
    数的默认值:
    In: concatenatel((a, b), axis = 0)
    Out:
    array([[ 0, 1, 2],
    [ 3, 4, 5],
    [ 6, 7, 8],
    [ 0, 2, 4],
    [ 6, 8,10],
    [12,14,16]])

    (3) 深度组合 将相同的元组作为参数传给dstack函数,即可完成数组的深度组合。所谓
    深度组合,就是将一系列数组沿着纵轴(深度)方向进行层叠组合。举个例子,有若干张二维平
    面内的图像点阵数据,我们可以将这些图像数据沿纵轴方向层叠在一起,这就形象地解释了什么
    是深度组合。
    In: dstack((a, b))
    Out:
    array([[[0, 0],
    [1, 2],
    [2, 4]],
    [[3, 6],
    [4, 8],
    [5,10]],
    [[6,12],
    [7,14],
    [8,16]]])
    (4) 列组合 column_stack函数对于一维数组将按列方向进行组合,如下所示:
    In: oned = arange(2)
    In: oned
    Out: array([0, 1])
    In: twice_oned = 2 * oned
    In: twice_oned
    Out: array([0, 2])
    In: column_stack((oned, twice_oned))
    Out:
    array([[0, 0],
    [1, 2]])
    而对于二维数组,column_stack与hstack的效果是相同的:
    In: column_stack((a, b))
    Out:
    array([[ 0, 1, 2, 0, 2, 4],
    [ 3, 4, 5, 6, 8,10],
    [ 6, 7, 8,12,14,16]])
    In: column_stack((a, b)) == hstack((a, b))
    Out:
    array([[ True, True, True, True, True, True],
    [ True, True, True, True, True, True],
    [ True, True, True, True, True, True]], dtype=bool)
    是的,你猜对了!我们可以用==运算符来比较两个NumPy数组,是不是很简洁?
    (5) 行组合 当然,NumPy中也有按行方向进行组合的函数,它就是row_stack。对于两
    个一维数组,将直接层叠起来组合成一个二维数组。
    In: row_stack((oned, twice_oned))
    Out:
    array([[0, 1],
    [0, 2]])
    对于二维数组,row_stack与vstack的效果是相同的:
    In: row_stack((a, b))
    Out:
    array([[ 0, 1, 2],
    [ 3, 4, 5],
    [ 6, 7, 8],
    [ 0, 2, 4],
    [ 6, 8,10],
    [12,14,16]])
    In: row_stack((a,b)) == vstack((a, b))
    Out:
    array([[ True, True, True],
    [ True, True, True],
    [ True, True, True],
    [ True, True, True],
    [ True, True, True],
    [ True, True, True]], dtype=bool)
    刚才做了些什么
    我们按照水平、垂直和深度等方式进行了组合数组的操作。我们使用了vstack、dstack、
    hstack、column_stack、row_stack以及concatenate函数。

  • 相关阅读:
    Spring scope注解
    classpath与clsspath*
    Hadoop 5 Hbase 遇到的问题
    Hadoop 3
    Hadoop 4 MapReduce
    Hadoop 2
    Hadoop 1
    毕业设计---jQuery动态生成的a标签的事件绑定
    毕业设计---json,Struts,ajax以及JQuery简单案例
    基于SSH框架的学生选课质量属性分析
  • 原文地址:https://www.cnblogs.com/jpld/p/4970872.html
Copyright © 2020-2023  润新知