Numpy数组的组合与分割实现的方法

目录
  • 数组的组合
    • 1.水平组合
    • 2.垂直组合
    • 3.行组合和列组合
    • 4.深度组合
  • 数组的分割
    • 1.水平分割
      • 1.1hsplit函数
      • 1.2split函数
    • 2.垂直分割
    • 3.深度分割

在介绍数组的组合和分割前,我们需要先了解数组的维(ndim)和轴(axis)概念。

如果数组的元素是数组,即数组嵌套数组,我们就称其为多维数组。几层嵌套就称几维。比如形状为(a,b)的二维数组就可以看作两个一维数组,第一个一维数组包含a个一维数组,第二个一维数组包含b个数据。

每一个一维线性数组称为一个轴。二维数组的第一个轴(axis=0)就是以数组为元素的数组,第二个轴(axis=1)就是数组中的数组。因此第一个轴的方向就是沿着行的方向(垂直方向),第二个轴的方向沿着列的方向(水平方向)。

我们从嵌套数组的角度来看,a[0],a[1],a[2],a[3]……分别是取二维数组的第一行,二行,三行,四行……这正是先沿着第一个轴取元素(元素为行)。a[0][0],a[0][1]……则是(沿着第二个轴)取第一行的第一个元素,第二个元素……

也就是说,数组的轴从最外层数起。

三维数组我们应该怎么理解呢?我们可以把它看作二维数组的堆叠,即一个立方体。它的第一个轴(axis=0)就是以二维数组为元素的数组,它的方向沿着二维数组堆叠的方向,也就是立方体的高。第二个轴自然就是立方体的宽,第三个轴就是立方体的长。举例来说,一个形状为(a,b,c)的三维数组就是a个形状为(b,c)的二维数组嵌套在一起。

a=np.arange(24).reshape(2,3,4)#建立一个维度为3,形状为(2,3,4)的三维数组
print(a)#打印
print(a.sum(axis=0))#沿第一个轴求和
print(a.sum(axis=1))#沿第二个轴求和
print(a.sum(axis=2))#沿第三个轴求和

'''
a的形状如下:
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]

 沿第一个轴求和:
 [[12 14 16 18]
 [20 22 24 26]
 [28 30 32 34]]

 沿第二个轴求和:
 [[12 15 18 21]
 [48 51 54 57]]

 沿第三个轴求和:
[[ 6 22 38]
 [54 70 86]]
'''

从这个例子可以看出,沿第一个轴求和,就是从上方把这个立方体“压扁”,第二个轴就是沿着宽,第三个轴就是沿着长。类似投影。

我们终于明白了,reshape函数的参数顺序不是我们想当然认为的长,宽;长,宽,高;因为你无法解释为什么三维数组变形后的形状与你所想的大相径庭。它的顺序是轴的顺序(第一条轴,第二条轴,第三条轴……),也就是沿这条轴有多少个元素。轴的概念很重要,在很多函数中都有体现。

再直观一点说,参数顺序应该是高,宽(行方向),长(列方向)。

所以,数组的维度就很好理解了,就是轴的数量。我们在理解多维数组的时候,不要先入为主地认为多维数组的元素会更多;多维数组只是它嵌套的层数多而已。高维数组也可能不含元素。

接下来我们介绍数组的组合。

数组的组合

数组的组合有水平组合,垂直组合,深度组合等方式。实现这些组合的函数主要有vstack,dstack,hstack,column_stack,row_stack,concatenate等。

因为我们最常用的数组也不过三维,所以用水平,垂直这样的字眼比较形象;但我们要明白,本质上是沿轴进行的操作。

数组组合通常不会改变数组的维度。

1.水平组合

hstack函数与concatenate函数

1.1hstack函数:水平连接多个数组。参数只有一个:以数组为元素的序列。

1.2concatenate函数:沿着现有的轴连接数组序列。

函数格式:concatenate((a1, a2, ...), axis=0, out=None)

参数说明:a1, a2, ...:为以数组为元素的类数组序列。其中数组形状必须相同。

axis=0:数组将沿着这个轴组合,如果坐标轴为None,数组在使用前被平铺。int型数据,可选参数,默认为零。

2.垂直组合

vstack函数与concatenate函数

2.1vstack函数:垂直连接多个数组。参数如上。

2.2concatenate函数:改一下轴参数就好。

水平组合和垂直组合是比较直观的说法,因为我们用的最多的数组就是一维和二维;实际上,它们分别是沿着第二条轴(水平),第一条轴(垂直)进行组合。

a=np.array([1])
a=a.reshape(1,1,1,1,1)#只有一个元素的五维数组
b=np.array([1])
b=b.reshape(1,1,1,1,1)#与a完全相同
c=np.hstack((a,b))#水平组合
d=np.vstack((a,b))#垂直组合
print(c)
print(d)
print(c.shape)
print(d.shape)

'''
水平组合
[[[[[1]]]

  [[[1]]]]]

垂直组合
[[[[[1]]]]

 [[[[1]]]]]

c的形状
(1, 2, 1, 1, 1) 

d的形状
(2, 1, 1, 1, 1)
'''

3.行组合和列组合

3.1row_stack函数:行组合

将一维数组按行方向组合起来,对于二维数组完全等同于vstack。对于多维数组,实际上就是沿第一个轴进行组合。

3.2colum_stack函数:列组合

将一维数组按列方向组合起来,对于二维数组完全等同于hstack。对于多维数组,实际上就是沿第二个轴进行组合。

a=np.array([0,1,2])
b=np.array([1,2,3])
c=np.row_stack((a,b))
d=np.column_stack((a,b))
print(c)
print(d)

'''
行组合
[[0 1 2]
 [1 2 3]]

列组合
[[0 1]
 [1 2]
 [2 3]]

'''

a=np.array([0,1,2]).reshape(1,1,1,1,3)
b=np.array([1,2,3]).reshape(1,1,1,1,3)
c=np.row_stack((a,b))
d=np.column_stack((a,b))
print(c)
print(d)
print(c.shape)
print(d.shape)

'''
行组合
[[[[[0 1 2]]]]

 [[[[1 2 3]]]]]
[[[[[0 1 2]]]

列组合
  [[[1 2 3]]]]]

c形状
(2, 1, 1, 1, 3)
d形状
(1, 2, 1, 1, 3)

'''

4.深度组合

沿着第三个轴进行组合。

a=np.array([0,1,2])
b=np.array([1,2,3])
c=np.dstack((a,b))#深度组合
print(c)
print(a.shape)
print(c.shape)

'''
[[[0 1]
  [1 2]
  [2 3]]]
(3,)
(1, 3, 2)
'''

a=np.array([0,1,2]).reshape(1,1,1,3)
b=np.array([1,2,3]).reshape(1,1,1,3)
c=np.dstack((a,b))
print(c.shape)

'''
(1, 1, 2, 3)
'''

当数组维度比较小的时候,比如一维和二维,如果组合时没有第二和第三参数,函数会自动为其在形状左侧补1,也就是拓展一层。这和之前说过的广播机制十分类似。

数组的分割

数组可以进行水平,垂直等方式进行分割。相关函数:hsplit,vsplit,dsplit,split。

我们可以将数组分割成相同大小(形状)的子数组,也可以指定分割的位置。

1.水平分割

hsplit函数和split函数。

沿水平方向,就是沿列方向,沿第二条轴(axis=1)方向。

1.1hsplit函数

格式:hsplit(ary, indices_or_sections)

第一个参数是数组;第二个参数是一个整数或列表,如果不指定,就会分割成相同大小的子数组。

a=np.arange(16).reshape(4,4)
pp.pprint(a)
pp.pprint(np.hsplit(a,2))#平均分割成两部分
pp.pprint(np.hsplit(a,[2,3]))#沿第二,三列,分割成三部分

'''
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

分割成两部分
[array([[ 0,  1],
       [ 4,  5],
       [ 8,  9],
       [12, 13]]),
 array([[ 2,  3],
       [ 6,  7],
       [10, 11],
       [14, 15]])]

分割成三部分
[array([[ 0,  1],
       [ 4,  5],
       [ 8,  9],
       [12, 13]]),
 array([[ 2],
       [ 6],
       [10],
       [14]]),
 array([[ 3],
       [ 7],
       [11],
       [15]])]
'''

1.2split函数

函数格式:split(ary, indices_or_sections, axis=0)

第一个参数:数组。

第二个参数:整数或列表,可选参数。

第三个参数:轴,可选参数。

a=np.arange(24).reshape(4,6)
print(a)
pp.pprint(np.split(a,[2],axis=0))

'''

[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]
[array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11]]),
 array([[12, 13, 14, 15, 16, 17],
       [18, 19, 20, 21, 22, 23]])]

'''

上面这个例子里,我们选择了第一条轴,也就是列方向。然后找到第二行一分为二。

a=np.arange(24).reshape(2,3,4)
print(a)
pp.pprint(np.split(a,[1],axis=0))#沿第一条轴,高
pp.pprint(np.split(a,[1],axis=1))#沿第二条轴,宽
pp.pprint(np.split(a,[1],axis=2))#沿第三条轴,长

'''

[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]

[array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]]]),
 array([[[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])]

[array([[[ 0,  1,  2,  3]],

       [[12, 13, 14, 15]]]),
 array([[[ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[16, 17, 18, 19],
        [20, 21, 22, 23]]])]

[array([[[ 0],
        [ 4],
        [ 8]],

       [[12],
        [16],
        [20]]]),
 array([[[ 1,  2,  3],
        [ 5,  6,  7],
        [ 9, 10, 11]],

       [[13, 14, 15],
        [17, 18, 19],
        [21, 22, 23]]])]
'''

上面是一个三维数组切割的例子。

2.垂直分割

vsplit函数和split函数

沿垂直方向,就是沿行方向,沿第一条轴(axis=0)方向。

split函数如上,改一条轴参数即可。

3.深度分割

dsplit函数

主要用于三维数组,其实就是沿第三条轴切割,就好比从上方切蛋糕一样。

a=np.arange(24).reshape(2,3,4)
b=np.dsplit(a,4)#把这个蛋糕从上切成四份
pp.pprint(b)

'''
[array([[[ 0],
        [ 4],
        [ 8]],

       [[12],
        [16],
        [20]]]),
 array([[[ 1],
        [ 5],
        [ 9]],

       [[13],
        [17],
        [21]]]),
 array([[[ 2],
        [ 6],
        [10]],

       [[14],
        [18],
        [22]]]),
 array([[[ 3],
        [ 7],
        [11]],

       [[15],
        [19],
        [23]]])]

'''

到此这篇关于Numpy数组的组合与分割实现的方法的文章就介绍到这了,更多相关Numpy数组组合与分割内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python numpy--数组的组合和分割实例

    数组的组合主要有: 1.水平组合:np.hstack(arr1,arr2) 或 concatenate(arr1,arr2,axis=1) 2.垂直组合:np.vstack(arr1,arr2) 或 concatenate(arr1,arr2,axis=0) 3.深度组合:np.dstack(arr1,arr2) 4.列组合:np.column_stack(arr1,arr2) 5.行组合:np.row_stack(arr1,arr2) 数组的分割主要有: 1.水平分割:np.split(arr

  • Numpy数组的组合与分割实现的方法

    目录 数组的组合 1.水平组合 2.垂直组合 3.行组合和列组合 4.深度组合 数组的分割 1.水平分割 1.1hsplit函数 1.2split函数 2.垂直分割 3.深度分割 在介绍数组的组合和分割前,我们需要先了解数组的维(ndim)和轴(axis)概念. 如果数组的元素是数组,即数组嵌套数组,我们就称其为多维数组.几层嵌套就称几维.比如形状为(a,b)的二维数组就可以看作两个一维数组,第一个一维数组包含a个一维数组,第二个一维数组包含b个数据. 每一个一维线性数组称为一个轴.二维数组的第

  • Python打开文件,将list、numpy数组内容写入txt文件中的方法

    python保存numpy数据: numpy.savetxt("result.txt", numpy_data); 保存list数据: file=open('data.txt','w') file.write(str(list_data)); file.close() 以上这篇Python打开文件,将list.numpy数组内容写入txt文件中的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • NumPy 数组使用大全

    NumPy 是一个Python 库,用于 Python 编程中的科学计算.在本教程中,你将学习如何在 NumPy 数组上以多种方式添加.删除.排序和操作元素. NumPy 提供了一个多维数组对象和其他派生数组,例如掩码数组和掩码多维数组. 为什么要用 NumPy NumPy 提供了一个 ndarray 对象,可以使用它来对任何维度的数组进行操作. ndarray 代表 N 维数组,其中 N 是任意数字.这意味着 NumPy 数组可以是任何维度的. 与 Python 的 List 相比,NumPy

  • Python中的numpy数组模块

    目录 一.numpy简介 1.numpy库作用: 2.NumPy 是一个运行速度非常快的数学库,主要用于数组计算,包含: 3.NumPy 应用 二.为什么用numpy 三.创建numpy数组 1.将列表转换创建numpy数组,可选择显式指定dtype 2.arange方式创建numpy数组 3.其他方式创建numpy数组 4.numpy或pandas中reshape()重塑形状(行列转换)的用法 4.numpy.random生成随机数 5. fromstring/fromfunction(了解)

  • Python如何遍历numpy数组

    目录 Python遍历numpy数组 numpy中数组的遍历技巧分享 1. 内置for循环 2. flat迭代器 3. nditer迭代器 Python遍历numpy数组 下面是示例代码: import numpy as np num = np.zeros([2, 3]) [rows, cols] = num.shape print(rows, cols) for i in range(rows):     for j in range(cols):         print(num[i, j

  • numpy数组拼接简单示例

    NumPy数组是一个多维数组对象,称为ndarray.其由两部分组成: ·实际的数据 ·描述这些数据的元数据 大部分操作仅针对于元数据,而不改变底层实际的数据. 关于NumPy数组有几点必需了解的: ·NumPy数组的下标从0开始. ·同一个NumPy数组中所有元素的类型必须是相同的. NumPy数组属性 在详细介绍NumPy数组之前.先详细介绍下NumPy数组的基本属性.NumPy数组的维数称为秩(rank),一维数组的秩为1,二维数组的秩为2,以此类推.在NumPy中,每一个线性的数组称为是

  • 浅谈numpy数组的几种排序方式

    简单介绍 NumPy系统是Python的一种开源的数组计算扩展.这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix)). 创建数组 创建1维数组: data = np.array([1,3,4,8]) 查看数组维度 data.shape 查看数组类型 data.dtype 通过索引获取或修改数组元素 data[1] 获取元素 data[1] = 'a' 修改元素 创建二维数组 data

  • Numpy数组的保存与读取方法

    1. 数组以二进制格式保存 np.save和np.load是读写磁盘数组数据的两个主要函数.默认情况下,数组以未压缩的原始二进制格式保存在扩展名为npy的文件中,以数组a为例 np.save("filename.npy",a) b = np.load("filename.npy") 利用这种方法,保存文件的后缀名字一定会被置为.npy 2. 存取文本文件 使用 np.savetxt 和 np.loadtxt 只能读写 1 维和 2 维的数组 np.savetxt:将

  • 对python numpy数组中冒号的使用方法详解

    python中冒号实际上有两个意思:1.默认全部选择:2. 指定范围. 下面看例子 定义数组 X=array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16],[17,18,19,20]]) 输出为5x4二维数组 第一种意思,默认全部选择: 如,X[:,0]就是取矩阵X的所有行的第0列的元素,X[:,1] 就是取所有行的第1列的元素 第二种意思,指定范围,注意这里含左不含右 如,X[:, m:n]即取矩阵X的所有行中的的第m到n-1列数据,含左不含右

  • numpy中实现ndarray数组返回符合特定条件的索引方法

    在numpy的ndarray类型中,似乎没有直接返回特定索引的方法,我只找到了where函数,但是where函数对于寻找某个特定值对应的索引很有用,对于返回一定区间内值的索引不是很有效,至少我没有弄明白应该如何操作尴尬.下面先说一下where函数的用法吧. (1)where函数的使用场景: 例如现在我生成了一个数组: import numpy as np arr=np.array([1,1,1,134,45,3,46,45,65,3,23424,234,12,12,3,546,1,2]) 现在a

随机推荐