一、NumPy ndarray 的创建
ndarray 的创建可理解为数组的设置与引用。
1. np.array()
作用: 将 Python 的序列(如列表、元组)转换为 NumPy 数组。
本文系统介绍了 NumPy 库在 Python 数据分析中的核心应用,涵盖 ndarray 数组的创建、属性与数据类型、矩阵运算、索引切片、基本数学函数、统计函数、比较逻辑及排序去重等功能。通过代码示例讲解了广播机制、随机数生成及常用函数的使用方法,帮助读者掌握数值计算的基础技能。
ndarray 的创建可理解为数组的设置与引用。
作用: 将 Python 的序列(如列表、元组)转换为 NumPy 数组。
list_data = [4, 5, 6]
arr = np.array(list_data)
参数 dtype=np.float64:指定数组元素的数据类型。若不指定则自动推断(原列表是整数,默认会转成 int 类型)。
copy 即复制的意思,我们可以将一个元素的原始数组完全复制给另一个元素。对于两个元素而言完全相同,但是两者在复制后无关联,因此我们在复制的元素内进行修改不会影响原元素的数组。
对于上述的预定义形状我们有两种特殊的语法即:全部数据为 0/全部数据为 1。
np.zeros(shape),其中括号表示的是所预定的形状。np.ones(shape),其内部的内容与上述的一致。
注意:与上述的 np.array() 语法不同,预定义形状的默认值为 float 类型,因此所展现的数都为浮点数。而 np.array() 的默认值为整数 int 类型。np.empty() 是 NumPy 中创建未初始化数组的函数,核心特点是'快速但内容随机':
np.empty(shape, dtype=float, order='C')
shape(必填):数组的形状,用元组表示。dtype(可选):数组元素的数据类型,默认是 float。order(可选):内存中元素的存储顺序('C'是按行存储,'F'是按列存储),默认'C'。
核心特性:'未初始化'的含义。np.empty() 不会主动给数组元素赋值,而是直接使用内存中已有的随机数据('垃圾值')。由于对于其他数而言我们若想写出除了 0/1 以外的数组那么就要用到语法:np.full(shape, fill_value) 来进行编写。其中 shape 即数组形状,fill_value 即我们所希望填写进数组里的其他数。
like 语法即在前面所讲的 full, ones, zeros, empty 后加入"_"和一个 like,其作用是将一个新的元素预定义其排列形式像另一个元素一样。与 copy 不同,like 指的是排列形式一样其内部的数据不相同我们可以自己填充,而 copy 则是数据内容与排列形式都相同。若我们未给 like 元素进行数据填充,那么系统默认为 0。
该部分的内容与我们前面所学的序列内容相似,其语法为 np.arange(start, stop, step)。
start 即初始的值。stop 指的是最后能框住末端的数,因此在数列中的最后一个数为 stop-1。step 表示的是步长。语法:np.linspace(start, stop, num)。
start 表示的是起始值。stop 在此处与上方的等差数列的 end 不同,此处的 stop 表示的是最终所要到达的数。num 表示的是取的数的个数。语法:np.logspace(start, stop, num, base)。
start, stop, num 与上面的等间隔数列相同。base 表示的是对数的底。注意:若我们未对 base 进行定义那么系统则默认为其 base 为 10,即对数的底数为 10。且一般使用科学计数法来进行计数。上方图中的内容即为我们 ndarray 中各个语法的作用即使用示例,我们可以根据编码要求来对其进行使用。而对于上述的语法使用其使用方法都为:变量名。属性名(该处的变量名指的是已定的数组代指名)。
0 维数组由于其特殊性因此对于大部分的属性而言不能明显突出其性质。
该处为一维数组其性质与上方的 0 维数组差别不大。
该图为二维数组表现的 ndarray 性质,由此图我们可以清晰的看出对于 ndarray 而言,其 size 元素的个数与其内部的数据个数相同,元组的形状有几个 [] 那么左侧便是几,[] 内部的元素有几个那么 [] 右侧便是几。而对于元素的转置我们可以明显的看出所谓的元素转置即将行变成列,列变成行。
与 matplotlib 相类似,在使用 numpy 的语法前我们需要进行导包操作,即语法:import numpy as np。
我们创建一个数组其语法为:变量名 = np.array()。对于 ndarray 而言支持多维度,其用处类似于 C 语言当中的数组与多维数组,且在 ndarray 中我们的数组最小维 0 维开始计算。而在 ndarray 中的多维数组我们需要将其内部用 [] 来框住,即上方最下面的代码中二维数组的书写形式 arr = np.array([[1, 2, 3], [4, 5, 6]])。
对于 ndarray 而言同质性其简单描述就是:我们对于不同类型的数据在代码运行的过程中会将其转化为相同类型的数据类型,且对于转化的类型标准为高位转化,即最大程度保留原属性,例如:上图中下方的代码我们优先将整数转化为浮点类型(因为浮点类型包含整数类型)。
我们可以设置不同的 dtype 来设置不同的数据类型,当我们设置为 bool 类型时其输出的内容都为 True 或 False。
当我们数据大小过大时我们使用 int8 这种数据类型会使得我们的数据报错,因此一般情况下使用单 int 来将取值范围增大:其原理是由于 int 有不同的类型即 int8/int32/int64。当我们使用单 int 时系统会自动调配使得程序得以正常运行。
矩阵是由数字按行和列排列成的矩形数组,是线性代数中的核心概念之一。由 m 行 n 列元素组成的矩形结构,记为 m×n 矩阵。
即主对角线上的数字为 1,其他数字为 0。语法:np.eye(num, dtype=...)。num 即填入的数字,若填入的数字为单个 n 那么代码运行后会生成一个 n*n 的矩阵。注意:在该语法中默认数为浮点类型,因此当我们希望整体美观为整数时要使用 dtype 来进行类型转化。
当我们不希望矩阵为 nn 型时我们可以在语法内部用逗号将数据分开来写成 (num1, num2) 的矩阵格式,其生成的矩阵为:num1num2 的矩阵。
主对角线上非零,其他数字为 0。语法为:np.diag([填入的数据])。
对于所填入的数据:在 np.diag() 中,若未指定 dtype 参数,其生成数组的默认数据类型由输入序列的元素类型决定。示例中输入的是整数列表 [5, 1, 2, 3],因此默认生成的数组数据类型是整数类型。若输入序列包含浮点数(如 [5.0, 1, 2, 3]),默认类型则为浮点数类型。
np.random.randn(num1, num2)。np.random.uniform(low, high, size),其中随机生成的数处于 low 与 high 之间,生成的数为浮点数。np.random.randint(low, high, size),其中随机生成的数处于 low 与 high 之间,生成的数为整数。np.random.randn(size)。种子即固定内容,我们可以设置一个种子那么后续随机生成的数的结果都为第一次生成的随机数,由此我们可以使用种子来保留最初随机生成的数组数据内容。语法:np.random.seed(seed)。其中 seed 后括号里的 num 指的是指定种子。只要设置了相同的种子(比如都是 20),后续调用 np.random 相关函数(如 randint)生成的随机数序列完全固定。
矩阵乘法(Matrix Multiplication)是线性代数中最核心的运算之一。与普通的数字乘法相比,它的规则更为严格且独特。 以下是矩阵乘法的运算规律总结(此处我们做到写代码会用即可): 若 A 是 m×n 矩阵,B 是 n×p 矩阵,则乘积 C=AB 是一个 m×p 矩阵。
在 numpy 中的矩阵乘法我们使用语法:A @ B,其中@即为矩阵乘法运算符表示矩阵 A 与 B 进行乘法运算。
所显示的矩阵结果例如第二行第三列的 87,其运算过程如下:将 A 与 B 的矩阵按行与列进行排开,由于 87 位于 (2,3),因此将 A 中的第二行 [4, 5, 6] 与 B 中的第三列 [6, 9, 3] 分别取出,将两重新挑出的数组一一对应相乘再相加即:46+59+6*3=87。其余运算结果过程都如上所述。
在 numpy 中的一位数组运算其本质上是:相同形式的数组对应元素相互运算,其包含基本的加减乘除。 对于我们之前所学习的数列而言,正常的数列相加是在其后方加上数组,即两个数组合并成一个新的数组而并非我们上面所述的对应元素相加。而在学习 numpy-ndarray 的运算之前若我们希望实现对应元素的相加减那么需要使用 for 循环来遍历列表从而实现数组的相加减。
对于多维度的数组我们只要当形式相同时那么便可以实现基本的四则运算(要时刻注意前提是形式相同)。
数组与标量的算数运算,当我们使用 numpy 的 ndarray 创建了一个数组,若我们在输出的过程中给该数组增加了一个标量,那么该数组的所有元素都会和该标量进行相加,简单理解可以认为:其在内部实现了一个 for 循环使得所有的元素得以加上标量。
对于不可以广播的两数组而言若是对两者进行四则运算则会进行报错。因此我们要使用广播机制要注意两数组的行数与列数是否相等。
矩阵的运算其运算符号为'@',矩阵的计算方法请回顾上述内容。
语法:np.random.randint(start, end, shape),random 随机数,所取得数在 start 和 end 之间,shape 为所塑的形状,若为单个数则为一位数组,若为 [[num1,num2]] 的形式那么变为多维数组(具体为什么数组根据括号内的中括号来定)。
由于是数组,因此我们可以根据下标索引来获得我们想要知道位置的值。当我们使用单个符号':'时,其意思为获取该数组内的所有数据。但是当我们使用语法:数组名 [num1:num2],其意思为取区间 (num1) 到 (num2-1) 之间的所有数,即前闭后开。
布尔索引:我们可以通过判断来输出我们所想要输出的内容,即在数组中设置判断条件来限制区间。 slice 是 Python 中的切片对象,作用是定义'从哪里开始、到哪里结束、步长是多少'的取值规则:
由于索引从 0 开始,因此上图中的 arr[1,3] 指的其实是第二行第四个的数值。
与一维数组相同符号':'所表示的是全部内容,若输出形式为:数组名[:, :],那么想表示的意思为取这个二维数组所有行和所有列的内容,该处用逗号隔开其作用本质上相类似。
同时我们还可以利用索引来对二维数组进行数值判断,其具体语法体现为:数组 [num1][数组 [num2] 判断条件]。当后面的判断条件符合时其展现的为布尔值,对应的布尔值会嵌入对应的下标中,因此当下标为 True 的数将会被输出,从而我们的到了符合条件的数。若是我们直接对数组进行判断那么输出的结果为布尔值,并非我们所希望得到的符合条件的数。
总结:对于所有的基本数学函数而言其语法形式都为:np.语法名()。
round 即范围的意思,语法:np.round(数组)。作用:将数组内的浮点数四舍五入,且四舍五入遵循银行家舍入即:奇数取偶,偶数保留。例如:4.5 取 4,5.5 取 6。
指定取数:包含指定向上和向下取整。
np.ceil(数组),ceil 即天花板的意思,因此表示向上取整。np.floor(数组),floor 即地板的意思,因此表示向下取整。np.isnan(x) 是 NumPy 中用于判断元素是否为 NaN(Not a Number,非数字,代表缺失 / 无效值)的函数,返回一个布尔数组:若元素是 np.nan,对应位置返回 True;否则返回 False。
np.nan 是 NumPy 中表示缺失值的特殊值,不能用普通的==判断(比如 x == np.nan 永远返回 False),必须用 np.isnan();即:只能使用该语法来进行判断检测缺失值 NaN。总结:与基本数学函数相类似,上面所述的语法形式一般为:np.语法名(数组)。
函数的使用:np.函数名。
np.greater(数组,num),此处 num 指的是要比较大小的数。np.less(数组,num),此处 num 指的是要比较大小的数。np.equal(数组,num),此处 num 指的是要比较大小的数。
在数组之间也可以进行比较(两数组 (矩阵) 要形式相同才可以进行比较(广播性))且两数组进行比较是一一对应比较的。对于比较函数而言所输出的形式都为布尔类型。logical 即逻辑的意思,其主要体现为:与,或,非。注:1 表示 True,0 表示 False。 语法:
np.logical_and(数组 1,数组 2):and 即与,若两个语法都为 True 那么结果为 True,反之则都为 False。
np.logical_or(数组 1,数组 2):or 即或,若两个元素中有一个为 True 则为 True。
np.logical_not(数组 1,数组 2):not 即非,将 True 与 False 进行调换。
解析:对于上述的 and, or 逻辑语比较中,是将两个数组进行排开再根据下标一一对应进行比较。例如上面第二行代码的结果为 True,其原因是将两个下标分别排开后为 [1,0] [0,1],由于语法为 or,因此当新组成的数组内含有 1 时便为 True,and 语法相类似。
np.any(数组):作用:检查元素中是否至少有一个元素为 True。
np.all(数组):作用:检查是否所有的元素都为 True(即 1)。
自定义条件:
语法:np.where(条件,符合条件,不符合条件的)。结果体现为:若符合条件那么便输出上述的 '符合条件',若不符合条件那么便输出上述的 '不符合条件的'。
自定义条件是可以进行嵌套操作的,通过运用自定义条件的嵌套操作我们可以简化我们的代码,如上述的判断成绩状态的代码,可以通过自定义条件的嵌套来实现类似于 C 语言当中的 switch-case 的操作,从而简化我们的代码。
select 即挑选的意思,作用为挑选出数组中符合条件的数。
其语法为:np.select([条件 1,条件 2,条件 3,.....], [符合条件 1,符合条件 2,符合条件 3,.....], default=' ')。
注:未知结果标准语法为:default=' ',这一步是必要的,若无该内容程序将报错,这是编写要求。
sort 排序语法在之前的学习中我们已经学习过,在 numpy 中的排序函数其语法为:
np.sort(数组):不改变原数组的位置,但是将数组内排序好的数进行输出。np.argsort(数组):作用是将排序前的元素原下标索引位置进行输出。去重函数:将数组内部重复的元素进行去除。语法:np.unique(数组),其中 unique 即唯一的意思,因此用于去除重复元素。
由于 numpy 中数组的特殊性,直接的相加减是对应元素相加减,因此我们给定一个新的语法来使其数组能够正常拼接,语法为:np.concatenate(数组 1,数组 2),作用为将两数组首尾相连进行拼接。
split 即分离,因此语法为:np.split(数组,num/数组),该处的 num 指的是分割出来的一份的个数。在使用该语法时要确认所分割的数组可以等分,若不能等分我们也可以根据数组来写出我们想分割的位置来进行分割。其语法为:np.split(数组,[分割处的下标]),作用为:在所指定的下标处进行分割。
对于一个定义好的数组,例如上述的一维数组我们可以通过语法来将其形态进行改变。其语法为:np.reshape(数组,[重新改变的数组形状]),re 即重复的意思,shape 为塑形。注意:在此处重新塑形的数组不能超过原数组,即:要确认所重塑的数组可分。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online