别碰我腰椎

V1

2022/10/09阅读:25主题:默认主题

Numpy:关于flatten的理解

Numpy: flatten

numpy.flatten(order='C')

将数组的副本(不更改原始数据)转换为一维,简单理解就是把数组拉平拉直
options order={'C', 'F', 'A', 'K'}

  • 'C': C-style, 行为主要顺序,先从左到右,再从上到下,默认是**'C'**
  • 'F': Fortran-style, 列为主要顺序,先从上到下,再从左到右
  • 'A':如果a是Fortran在内存中连续的,那么'A' 意味着以列主要顺序变平,否则按行排序
  • 'F':按照元素在内存中出现的顺序来拉平a
    常用的是前两个,记录如下

二维数据

import os
import numpy as np
# 随机生成一个2维数组,4行3列
arr1 = np.random.randint(110, size=[43])
arr1
array([[9, 8, 5],
       [3, 2, 5],
       [8, 7, 4],
       [5, 9, 2]])
# 查看数组1的维数
arr1.ndim
2
# 将数组arr1以行为主要顺序进行拉平降维
arr2 = arr1.flatten()
arr2
array([9, 8, 5, 3, 2, 5, 8, 7, 4, 5, 9, 2])
# 此时查看数组arr2的维数,可以看到现在已经从2维降到了1维
arr2.ndim
1
arr1.shape
(4, 3)
# 将数组arr1以列为主要顺序进行拉平降维
arr3 = arr1.flatten(order='F')
arr3
array([9, 3, 8, 5, 8, 2, 7, 9, 5, 5, 4, 2])
# 查看此时的数组维度
arr3.ndim
1

三维数据

因为经常接触到的数据一般都是栅格影像数据,而栅格影像一般都是三维数据,比如常见的landsat影像,都是包含多个波段的,我们可以随机构建一个三维的数据

# 随机创建一个3维的数组
arr4 = np.random.randint(110, size=[433])
arr4
array([[[6, 7, 3],
        [5, 1, 7],
        [5, 4, 6]],

       [[8, 5, 2],
        [9, 4, 3],
        [6, 9, 9]],

       [[9, 9, 2],
        [2, 2, 8],
        [5, 5, 3]],

       [[3, 1, 2],
        [4, 6, 1],
        [8, 3, 5]]])

对于这个随机的三维数组如果联系上栅格影像可以这样理解,这是一个具有四个波段的影像,每个波段的长宽都是3,也就是3*3 包括我们平常用gdal和rasterio等包去读取影像获取其值时得到的也是如此的数组,每个波段都可以看作一层,有几个波段就是几层

# 对arr4进行以行为主就行降维
arr5 = arr4.flatten()
arr5
array([6, 7, 3, 5, 1, 7, 5, 4, 6, 8, 5, 2, 9, 4, 3, 6, 9, 9, 9, 9, 2, 2,
       2, 8, 5, 5, 3, 3, 1, 2, 4, 6, 1, 8, 3, 5])

可以看到,对于三维数组,在以行为主时和二维时一样,都是从左到右,从上到下的顺序

# 对arr4进行以列为主就行降维
arr6 = arr4.flatten(order='F')
arr6
array([6, 8, 9, 3, 5, 9, 2, 4, 5, 6, 5, 8, 7, 5, 9, 1, 1, 4, 2, 6, 4, 9,
       5, 3, 3, 2, 2, 2, 7, 3, 8, 1, 6, 9, 3, 5])

但是在以列为主进行降维时,与二维时有些不同,我们对比着前面的arr4看,因为这涉及到numpy的轴的原因,三维时可以理解为存在一个x,y,z三个轴的坐标系 假设3*3构成的数组是x,y轴,然后在z轴上分布着4层,此时以列为主就是以z轴为主,之后再回到了二维上从上到下,从左到右

结尾

以上所有内容只是我个人见解,如果有误请哥哥姐姐们指正,幼儿园的车要送我回家了,拜拜!

公众号:壹贰叁言

随笔记录,欢迎唠嗑

分类:

后端

标签:

Python

作者介绍

别碰我腰椎
V1