Numpy模块下的ndarray介绍
文章目录
- 导入numpy模块
- 根据列表生成数组
- 创建各维度的数组
- ndim属性和shape属性的区别
- 数据点的维度和数组的维度区别
- a= np.array([[[-5, 0]], [[5, 0]]]) 和 b= np.array([[[-5, 0], [5, 0]]])的区别
导入numpy模块
import numpy as np
根据列表生成数组
以一维数组为例:
# 一维数组
arr1 = np.array([1, 2, 3, 4]) #[1, 2, 3, 4]是python内置的列表结构,据此生成数组
ndarray
:是arr1的数据类型。其中 nd:表示n维,array:表示数组。整体表示 n维数组的意思。
创建各维度的数组
# 一维数组
arr1 = np.array([1, 2, 3, 4])
# 二维数组
arr2 = np.array([[1, 2], [3, 4]])
# 三维数组
arr3 = np.array([[[1, 2]], [[3, 4]]])
# 四维数组
arr4 = np.array([[[[1, 2, 3]]], [[[4, 5, 6]]]])
下面详细介绍下一到四维度的数组,通过视觉判断数组维度的方法:可以数两端(其中一端都可以)的[
的个数。也可以通过程序代码来判断:以arr1为例,arr1.ndim的返回值
一维数组
:
arr1 = np.array([1, 2, 3, 4])
print(f"arr1.ndim: {arr1.ndim}") # 1
print(f"arr1.shape: {arr1.shape}") # (4,)
print(f"arr1长度: {len(arr1)}") # 4
# 第0个元素: 4 - 表示有4个元素
问题:arr1.shape的输出(4,)为啥是这样,它没有行和列吗?
arr1.shape输出(4,)是因为:
- 一维数组没有行列概念:
- 一维数组只有长度,没有行和列的区分
- (4,)表示这个数组有4个元素
- 形状元组的含义:
- (4,)中的逗号表示这是一个元组
- 4表示数组长度为4
- 没有第二个元素表示只有1个维度
二维数组
:
arr2 = np.array([[1, 2], [3, 4], [5, 6]])
print(f"arr2.ndim: {arr2.ndim}") # 2
print(f"arr2.shape: {arr2.shape}") # (3, 2)
# 第0个元素: 3 - 表示有3行
# 第1个元素: 2 - 表示每行有2列
可以这样直观的看行和列数:
arr2 = np.array([
[1, 2],
[3, 4],
[5, 6]
])
问题:arr2.shape的输出为 (3, 2),它没有二维平面吗?
三维数组才有平面概念,二维数组没有平面概念。
问题:二维数组是不是有一个二维平面。其实就是1
回答
:
import numpy as np# 二维数组可以看作有1个二维平面
arr2 = np.array([[1, 2], [3, 4]])
print(f"arr2.shape: {arr2.shape}") # (2, 2)
print(f"arr2.ndim: {arr2.ndim}") # 2# 等价于三维数组的1个平面
arr3 = np.array([[[1, 2], [3, 4]]]) # 注意外面多一层[]
print(f"arr3.shape: {arr3.shape}") # (1, 2, 2)
print(f"arr3.ndim: {arr3.ndim}") # 3# 验证两者的关系
print(f"arr2 == arr3[0]: {np.array_equal(arr2, arr3[0])}") # True
理解方式:*
- 二维数组 = 1个二维平面
- 三维数组 = 多个二维平面
- arr3[0]就是取三维数组的第0个平面,结果就是二维数组
三维数组
:
# 三维数组
arr3 = np.array([[[1, 2]], [[3, 4]]])
print(f"arr3.shape: {arr3.shape}") # (2, 1, 2)
# 第0个元素: 2 - 表示有2个二维平面,即 [[1, 2]] 和 [[3, 4]] 分别代表1个二维平面。
# 第1个元素: 1 - 表示每个平面有1行
# 第2个元素: 2 - 表示每行有2列
问题:三维数组的平面概念是不是就是图层?
是的,三维数组的平面概念可以理解为图层:
import numpy as np# 三维数组 - 可以看作多个图层
arr3 = np.array([[[1, 2]], [[3, 4]]])
print(f"arr3.shape: {arr3.shape}") # (2, 1, 2)
# 第0轴: 2个图层
# 第1轴: 每个图层1行
# 第2轴: 每行2列# 访问不同图层
print("第0个图层:")
print(arr3[0]) # [[1 2]]
print("第1个图层:")
print(arr3[1]) # [[3 4]]# 更明显的图层示例
layers = np.array([[[1, 2, 3], [4, 5, 6]], # 第0层[[7, 8, 9], [10, 11, 12]], # 第1层[[13, 14, 15], [16, 17, 18]] # 第2层
])
print(f"layers.shape: {layers.shape}") # (3, 2, 3)
# 3个图层,每层2行3列
四维数组
:
import numpy as np# 四维数组示例
arr4 = np.array([[[[1, 2, 3]]], [[[4, 5, 6]]]])
print(f"arr4.ndim: {arr4.ndim}") # 4
print(f"arr4.shape: {arr4.shape}") # (2, 1, 1, 3)# 更直观的四维数组
arr4_demo = np.array([[[[1, 2], [3, 4]], [[5, 6], [7, 8]]], # 第0个三维块[[[9, 10], [11, 12]], [[13, 14], [15, 16]]] # 第1个三维块
])
print(f"arr4_demo.ndim: {arr4_demo.ndim}") # 4
print(f"arr4_demo.shape: {arr4_demo.shape}") # (2, 2, 2, 2)
四维数组shape的理解
:
- shape元组有4个元素:(a, b, c, d)
- 第0个元素a:有a个三维块
- 第1个元素b:每个三维块有b个二维平面
- 第2个元素c:每个二维平面有c行
- 第3个元素d:每行有d列
ndim属性和shape属性的区别
array.ndim
:
- 返回数组的维度数(标量值)
- 表示数组有多少个轴
array.shape
:
- 返回数组各维度的大小(元组)
- 表示每个轴上有多少元素
数据点的维度和数组的维度区别
数据点的维度(特征维度)
:
指每个数据点有多少个特征属性
例如:一个二维坐标点 [x, y],数据点维度是2
数组的维度(形状维度)
:
指数组的结构形状,有多少行、列等
例如:100个数据点,每个点2维,数组形状是(100, 2)
在代码中对应整个数组的shape属性
import numpy as np# 示例:100个二维数据点
data = np.random.rand(100, 2)
# ^ ^ ^
# | | |
# 数组维度 | 数据点维度
# (形状) 数组维度 (特征数)
# (100,2) (2维) (每个点2个特征)
数组的形状维度对应的是shape
。数组维度对应的是ndim
。通过上面的观察可知ndim的标量值,对应的是shape(是一个元组)的元素个数。
a= np.array([[[-5, 0]], [[5, 0]]]) 和 b= np.array([[[-5, 0], [5, 0]]])的区别
import numpy as np
a= np.array([[[-5, 0]], [[5, 0]]]) # a有两个二维平面(去掉最外层的[],看里面有几个二维数组,就是有几个二维平面)
print(f"a.ndim: {a.ndim}") # 3
print(f"a.shape: {a.shape}") # (2, 1, 2)b= np.array([[[-5, 0], [5, 0]]]) # b有一个二维平面(去掉最外层的[],看里面有几个二维数组,就是有几个二维平面)
print(f"b.ndim: {b.ndim}") # 3
print(f"b.shape: {b.shape}") # (1, 2, 2)
小技巧
:去掉最外层的[],看里面有几个二维数组,就是有几个二维平面。