前言
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])
Logo

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

更多推荐