NumPy Ndarray学习

1.NumPy Ndarray 对象简介

NumPy 最重要的特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。ndarray 对象是用于存放同类型元素的多维数组。ndarray 中的每个元素在内存中都有相同存储大小的区域。

2.Ndarray 内部组成

(1)一个指向数据(内存或内存映射文件中的一块数据)的指针。

(2)数据类型或 dtype,描述在数组中的固定大小值的格子。

(3)一个表示数组形状(shape)的元组,表示各维度大小的元组。

(4)一个跨度元组(stride),整数是为了前进到当前维度中下一个元素需要"跨过"的字节数。

3.Ndarray关键组成部分

(1)数据缓冲区(Data Buffer):存储数组元素的连续内存块,所有数据都以二进制格式保存在内存中。ndarray 支持各种数据类型,例如 int32、float64,这些数据类型通过 dtype 属性定义。

(2)数据类型描述符 (dtype):指定数组中每个元素的数据类型和大小。例如,int32 表示每个整数占 4 字节,float64 表示每个浮点数占 8 字节。dtype 还可以表示结构化数据类型,即包含多个字段的复合数据类型。

(3)维度 (shape):shape 是表示数组维数的元组。例如二维数组的 shape 属性可能是 (3, 4),表示数组有 3 行 4 列。shape 定义数据的逻辑结构,尽管所有元素是连续存储的。

(4)步长 (strides):表示在数组的每个维度中移动一个元素所需的字节数。strides 是与 shape 相同大小的元组,用于计算内存地址。例如,步长 (16, 4) 表示移动到下一行需要 16 字节,而在同一行中移动一个元素需要 4 字节。

(5)维数 (ndim):数组的维数。例如,标量的维数是 0,向量的维数是 1,矩阵的维数是 2。

(6)大小 (size):数组中元素的总数,即所有维度大小的乘积。例如,shape 为 (3, 4) 的数组,其 size 为 12。

(7)内存布局:ndarray 支持多种内存布局,例如C 语言风格(行优先,C_CONTIGUOUS)或 Fortran 风格(列优先,F_CONTIGUOUS)。内存布局影响数据的存储方式以及遍历数据效率。

4.Ndarray 的内部结构

跨度可以是负数,这会使数组在内存中后向移动。假设存在数组 obj = np.array([1, 2, 3, 4]),若使用切片 obj[::-1],步长为负数,数组会从最后一个元素反向读取,得到 [4, 3, 2, 1] 的结果。

(1)header:ndarray 的头部,包含了数组的元信息,如维数(ndim)、形状(shape)和步长(strides)等。这些信息定义数组的维度、数据布局以及如何通过步长在内存中访问数组元素。

(2)data-type:数组元素的数据类型定义,描述了数组每个元素的存储类型,例如 int32、float64 等。data-type 信息与数据缓冲区关联,用来解释每个元素的存储格式。

(3)ndarray 数据块:这是数组的实际数据存储区域,包含了数组的元素。元素在内存中按照 shape 和 strides 的定义顺序排列。这里的黑色方框表示一个特定的元素(标注为 array scalar)。

(4)array scalar:这个元素被从数组数据块中提取出来,可能是为了进行单独操作或计算。通过头部中的信息和步长可以找到并访问到这个元素。

(5)步长为负:图中还说明了 ndarray 的步长可以是负数,这意味着数组可以在内存中反向移动。通过使用负步长可以实现反向切片,如 obj[::-1] 或 obj[:, ::-1],从而使数组从最后一个元素开始向前访问数据。这种操作方式在不实际复制数据的情况下实现了反向排列。

5.调用 NumPy 的 array 函数创建ndarray

numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)

(1)object:数组或嵌套的数列

(2)dtype:数组元素的数据类型,可选

(3)copy:对象是否需要复制,可选

(4)order:创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)

(5)subok:默认返回一个与基类类型一致的数组

(6)ndmin:指定生成数组的最小维度

6.使用 numpy 创建并打印简单的一维数组

import numpy as np
a = np.array([1,2,3]) 
print (a)

7.使用 numpy 创建并打印二维数组(矩阵)

# 多于一个维度 
import numpy as np
a = np.array([[1,  2],  [3,  4]]) 
print (a)

8.使用 ndmin 参数将一维数据强制升维为二维

# 最小维度 
import numpy as np
a = np.array([1, 2, 3, 4, 5], ndmin =  2) 
print (a)

9.通过 dtype 参数来指定数组的数据类型

# dtype 参数 
import numpy as np
a = np.array([1,  2,  3], dtype = complex) 
print (a)
相关推荐
eric-sjq12 分钟前
基于xiaothink对Wanyv-50M模型进行c-eval评估
人工智能·python·语言模型·自然语言处理·github
是十一月末22 分钟前
机器学习之KNN算法预测数据和数据可视化
人工智能·python·算法·机器学习·信息可视化
工业互联网专业25 分钟前
基于OpenCV和Python的人脸识别系统_django
人工智能·python·opencv·django·毕业设计·源码·课程设计
百流35 分钟前
scala基础学习_运算符
开发语言·学习·scala
百流37 分钟前
scala基础学习(数据类型)-数组
开发语言·学习·scala
杜小白也想的美1 小时前
FlaskAPI-初识
python·fastapi
一只搬砖的猹1 小时前
cJson系列——常用cJson库函数
linux·前端·javascript·python·物联网·mysql·json
虾球xz1 小时前
游戏引擎学习第61天
java·学习·游戏引擎
CodeClimb1 小时前
【华为OD-E卷-租车骑绿道 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
CodeClimb1 小时前
【华为OD-E卷-MVP争夺战 100分(python、java、c++、js、c)】
java·python·华为od