Nmupy的灵魂:ndarray多维数组对象
前言ndarray是一个n维数组对象,是Python中一个快速灵活的大型数据集容器,允许我们使用类似于标量的操作语法在整块数据上进行计算。这种说法可能有点抽象,但是在看到后面对于ndarray的具体操作之后,相信你会有一个清晰的认识。一个ndarray是一个通用的多维同类数据容器,也就是说,它包含的每一个元素均为相同类型。以下文章中“数组”、“Numpy数组”、“ndarray”为同一对象:nda
前言
ndarray是一个n维数组对象,是Python中一个快速灵活的大型数据集容器,允许我们使用类似于标量的操作语法在整块数据上进行计算。这种说法可能有点抽象,但是在看到后面对于ndarray的具体操作之后,相信你会有一个清晰的认识。
一个ndarray是一个通用的多维同类数据容器,也就是说,它包含的每一个元素均为相同类型。以下文章中“数组”、“Numpy数组”、“ndarray”为同一对象:ndarray对象。
numpy主要用于多维数组和矩阵运算,在numpy中的多维数组和矩阵就是ndarray对象,所以说它是numpy的灵魂毫不夸张。
numpy包的引入:
import numpy as np //这种引入方式是约定俗成的
以下的示例代码非特殊需要将不写此语句,默认已经引入numpy包。
PS: 这篇文章是我写的numpy知识总结的一部分,完整知识总结入口在这篇文章,在这篇文章里我搭建了numpy的基础知识框架,非常适合入门。
文章目录
1. ndarray属性
1) 数组基本属性
属性 | 说明 |
---|---|
ndarray.ndim | 秩,即轴的数量或维度的数量 |
ndarray.shape | 数组的维度,对于矩阵,n 行 m 列 |
ndarray.size | 数组元素的总个数,相当于 .shape 中 n*m 的值 |
ndarray.dtype | ndarray 对象的元素类型 |
2) 维度与轴
ndarray是一个n维数组,自然的,数组是有维度的。对于二维数组,我们常常在使用索引的时候有选定轴向的操作,利用axis变量定义,如下:
axis=0 //行排队的方向
axis=1 //列排队的方向
开始的时候经常会记混,但是像上面这样记忆就不容易混,'1’不就像一个列吗,想象列和行都是一个个在排队,列排队的方向就是axis=1轴向,行排队的方向就是axis=0的方向。
3) 元素数据类型
同一个数组的所有元素类型都是相同的,元素的可用数据类型如下:
类型 | 类型代码(按顺序对应) | 描述 |
---|---|---|
int8, int16, int32, int64 | i1, i2, i4, i8 | 8,16,32,64位有符号整数 |
uint8, uint16, uint32, uint64 | u1,u2,u4,u8 | 8,16, 32,64位无符号整数 |
float16, float32, float64, float128 | f2, f4或f, f8或d, f16或g | 半、单、双、扩展精读浮点数 |
conplex64, complex128, complex256 | c8,c16,c32 | 基于32、64、128位浮点的复数 |
bool | ? | 布尔值 |
object | O | Python object类型 |
string_ | S | 修正的ASCII字符串类型 |
unicode_ | U | 修正的Unicode类型 |
numpy专注于数值计算,如果没有特别指明,默认的数据类型是float64。
关于数据类型,知道有这些即可,不用在意一个数组元素到低是什么类型,当你需要在内存或硬盘上做更深入的存取操作时,尤其是大数据集时,你才真正需要了解存储的数据类型。
转换数据类型
numpy提供了转换数组数据类型的函数ndarray.astype,通过下面例子展示:
【例】将一个int64的数组转换为float64
In [37]: arr1 = np.arange(10)
In [38]: arr1.dtype
Out[38]: dtype('int64')
In [41]: float_arr = arr1.astype('float64')
In [42]: float_arr.dtype
Out[42]: dtype('float64')
In [43]: arr2 = np.array([.23, .456, .234, 5.11, 9.22])
In [45]: arr1.dtype
Out[45]: dtype('int64')
astype接收的参数是numpy类型,上例中的’float64’等价于np.float64、ndarray.dtype(ndarray是一个float64类型的数组)。从上面的例子可以看到astype会生成一个新的数组,之前数组的类型并不会被改变。
2. 创建ndarray
1) 从列表和元组转换
这里使用两个numpy提供的函数:
函数名 | 描述 |
---|---|
array | 将输入数据(可以是列表、元组、数组等其他序列)转换为adarray,不显示指定类型时,自动推断类型。可在实参列表里加入参数(如 dtype=np.int64 )以指定类型。 |
asarray | 和array相同,区别是当输入数据是数组时,不再创建副本,而array会创建。 |
【例】分别用array和asarray从Python结构建立数组
In [49]: data1 = [[1,2,3],[4,5,6],[7,8,9]]
In [50]: data2 = ((1,2),(3,4),(5,6))
In [51]: arr1 = np.array(data1, dtype=np.float64)//指定元素类型为float64
In [52]: arr2 = np.array(data2)
In [53]: arr1
Out[53]:
array([[1., 2., 3.],
[4., 5., 6.],
[7., 8., 9.]])
In [54]: arr2
Out[54]:
array([[1, 2],
[3, 4],
[5, 6]])
In [55]: arr3 = np.asarray(data2)
In [56]: arr3
Out[56]:
array([[1, 2],
[3, 4],
[5, 6]])
2) 内在的Numpy数组创建函数
numpy提供了很多内建函数来建立数组,当我们创建临时数组或特定数组时很好用。
a. 给定数组形状生成数组
函数名 | 描述 | 函数名 | 描述 | 函数名 | 描述 | 函数名 | 描述 |
---|---|---|---|---|---|---|---|
ones | 全1 | zeros | 全0 | empty | 无初始值 | full | 全特定值 |
注意:数组形状要放在一个元组传入,数据类型是可选项。
【例1】四个函数的调用示例
In [67]: arr1 = np.zeros((3,3))
In [68]: arr1
Out[68]:
array([[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
In [69]: arr2 = np.empty
In [70]: arr2
Out[70]: <function numpy.empty>
In [71]: arr3 = np.ones((2,2),np.float64)
In [72]: arr3
Out[72]:
array([[1., 1.],
[1., 1.]])
In [73]: arr4 = np.full((2,2),6,np.float64)
In [74]: arr4
Out[74]:
array([[6., 6.],
[6., 6.]])
b. 生成与给定数组形状相同数组
函数名 | 描述 | 函数名 | 描述 | 函数名 | 描述 | 函数名 | 描述 |
---|---|---|---|---|---|---|---|
ones_like | 全1 | zeros_like | 全0 | empty_like | 官方说为空,我测试初始化为0 | full_like | 全特定值 |
【例2】四个函数的调用示例
In [76]: data = [[1,2],[3,4]]
In [77]: arr = np.array(data)
In [78]: arr
Out[78]:
array([[1, 2],
[3, 4]])
In [79]: arr1 = np.zeros_like(arr)
In [80]: arr1
Out[80]:
array([[0, 0],
[0, 0]])
In [81]: arr2 = np.ones_like(arr)
In [82]: arr2
Out[82]:
array([[1, 1],
[1, 1]])
In [83]: arr3 = np.empty_like(arr)
In [84]: arr3
Out[84]:
array([[0, 0],
[0, 0]])
In [85]: arr4 = np.full_like(arr,6)
In [86]: arr4
Out[86]:
array([[6, 6],
[6, 6]])
c 生成特殊数组
函数名 | 描述 |
---|---|
arange | 数组版的range函数,生成一维数组 |
arange.reshape | arange常常搭配reshape将一维数组转化为其他形状,此时要注意元素个数,要保证一维数组元素个数恰好足够转换为后面数组形状,否则报错 |
eye | 生成一个N X N的矩阵,主对角为1,其他元素为0,灵活,可传入多个维度,数据类型设置可选,形状不是方阵时,以左上角元素开始的最大方阵形成单位矩阵 |
idenyity | 生成一个N X N的单位矩阵,只生成方阵,元素类型设置可选 |
【例3】生成特殊数组方法举例
In [108]: arr1 = np.arange(4)
In [109]: arr1
Out[109]: array([0, 1, 2, 3])
In [110]: arr2 = np.arange(4).reshape(2,2)
In [111]: arr2
Out[111]:
array([[0, 1],
[2, 3]])
In [128]: arr3 = np.eye(2)
In [129]: arr3
Out[129]:
array([[1., 0.],
[0., 1.]])
In [130]: arr4 = np.eye(2,3) #不是方阵从左上角开始显示最大单位矩阵
In [131]: arr4
Out[131]:
array([[1., 0., 0.],
[0., 1., 0.]])
In [134]: arr5 = np.identity(2)
In [135]: arr5
Out[135]:
array([[1., 0.],
[0., 1.]])
3) 从特殊库函数生成:random库
numpy.random模块填充了Python内建random模块的不足,可以高效地生成多种概率分布下的完整样本值数组。
a. 生成概率分布下的数组
函数名 | 描述 |
---|---|
rand | 均匀分布,生成数值在0到1之间 |
randint | 在给定范围抽取整数,randint(low, high, size=shape) |
randn | 均值为0方差为1的正态分布 |
binomial | B=(n,p)的二项分布,binomial(n,p,size=shape) |
normal | 均值为e,标准差为d的正态分布,normal(e, d, size=shape) |
beta | 阿尔法为m, 贝塔为n的beta分布,beta(m,n,size=shape) |
chisquare | 参数为n的卡方分布,chisquare(n, size=shape) |
gamma | 参数为k, theta的伽马分布,gamma(k, theta, size=shape) |
uniform | a到b上的均匀分布,uniform(a, b, size=shape) |
这个例子就不写了,函数参数列表都写的很清楚,数据类型都是可选项,直接调用就行了。
b. 随机数工具
在计算机中几乎不可能实现真正的随机,大多都有一些算法,但是总有迹可循。numpy为了实现“可控的随机”,使用了随机种子,改变随机种子会改变随机输出。通常我们设置随机种子是为了产生相同的随机数组。
除了随机种子,有时候我们还需要随机排列有序的数字,numpy同样提供了这种函数。
函数名 | 描述 |
---|---|
seed | 向随机数生成器传递随机状态种子,生成全局随机种子 |
RandomState | 创建随机数生成器,用该生成器生成的数组相同,设置的是局部随机种子 |
permutation | 返回一个序列的随机排列,或者返回一个乱序的整数范围序列。产生新序列,不改变原序列。 |
shuffle | 随机排列一个序列。直接在原序列上操作,改变原序列,不产生新序列。 |
对全局和局部随机种子的讨论,篇幅较长,单独列出,seed方法和RandomState方法的使用例子也在这篇文章中。
当我们只是局部改变随机种子以产生相同随机数组的话,尽量使用RandomState,不要对全局随机种子进行改变,虽然通常情况下这种改变全局随机种子出错的机会很少。
【例】随机排列操作示例
In [177]: arr1 = np.arange(10)
In [178]: arr2 = np.arange(10)
In [179]: arr1,arr2
Out[179]: (array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]), array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]))
In [180]: np.random.permutation(arr1)
Out[180]: array([2, 9, 6, 7, 1, 4, 5, 3, 8, 0])
In [181]: arr1
Out[181]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [182]: np.random.shuffle(arr2)
In [183]: arr2
Out[183]: array([3, 2, 0, 5, 4, 7, 1, 9, 6, 8])

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)