别
别碰我腰椎
V1
2022/10/09阅读:89主题:默认主题
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(1, 10, size=[4, 3])
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(1, 10, size=[4, 3, 3])
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轴为主,之后再回到了二维上从上到下,从左到右
结尾
以上所有内容只是我个人见解,如果有误请哥哥姐姐们指正,幼儿园的车要送我回家了,拜拜!
公众号:壹贰叁言
随笔记录,欢迎唠嗑
作者介绍
别
别碰我腰椎
V1