Python----数据分析(Numpy:安装,数组创建,切片和索引,数组的属性,数据类型,数组形状,数组的运算,基本函数)
一、 Numpy库简介
1.1、概念
NumPy(Numerical Python)是一个开源的Python科学计算库,旨在为Python提供 高性能的多维数组对象和一系列工具。NumPy数组是Python数据分析的基础,许多 其他的数据处理库(如Pandas、SciPy)都依赖于NumPy。
NumPy的一些主要特点:
1. 高性能:NumPy底层主要采用C语言编写,相比于python来说运算速度快,性能 优越,并且保留了python的易用性。
2. 多维数组:NumPy提供了强大的n维数组对象ndarray,可进行高效的数据处 理,这是Numpy进行数据处理的核心对象。
3. 丰富的函数:NumPy内置了大量数学、统计和线性代数函数,方便进行数据计 算,除此之外还具有广播功能,可以允许不同形状的数组进行算术运算。
4. 广泛的接口:NumPy与许多其他科学计算库(如Matplotlib、SciPy)兼容,可 轻松实现数据交换和集成,此外,在人工智能领域中也可以很方便的和神经网络 中使用的张量进行结构转换。
1.2、安装
pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple/
二、Numpy-array与list的区别
Python中的list虽然可以灵活的处理多个元素,但它的效率很低,一般情况下 的科学运算的数据量是非常庞大的,所以list的效率低会导致整个科学运算的过程变 得非常慢。与之相比,Ndarray数组具有以下特点:
1. Ndarray数组所有元素的数据类型相同、数据地址连续,批量操作数组元素时速 度更快,而list中元素的数据类型可能不同,需要通过寻址的方式找到下一个元 素。
2. Ndarray数组支持广播机制,矩阵运算时不需要写for循环。
3. 底层主要使用C语言实现,运行速度远高于Python代码。
三、数组的创建
3.1、array创建数组
创建一个数组,可以转换任何形式的序列(如列表或元组)为NumPy数组。
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
| 名称 | 描述 |
|---|---|
| object | 数组或嵌套的数列 |
| dtype | 数组元素的数据类型,可选 |
| copy | 对象是否需要复制,可选 |
| order | 创建数组的样式,C为行方向,F为列方向,A为任意方向(默认) |
| subok | 默认返回一个与基类类型一致的数组 |
| ndmin | 指定生成数组的最小维度 |
import numpy as nparr1=np.array([1,2,3,4,5,6]
)
arr2=np.array([[1,2,3],[4,5,6],[7,8,9]]
)print(arr1)
print(arr2)'''
[1 2 3 4 5 6]
[[1 2 3][4 5 6][7 8 9]]
'''
3.2、arange创建数组
创建一个均匀间隔的数值数组,类似于Python的内置 range 函数。
numpy.arange([start,] stop[, step,], dtype=None)
| 参数 | 描述 |
|---|---|
| start | 起始值,默认为0 |
| stop | 终止值(不包含) |
| step | 步长,默认为1 |
| dtype | 返回ndarray的数据类型,如果没有提供,则会使用输入数据的类型。 |
import numpy as nparr1=np.arange(1,10,1)print(arr1)'''
[1 2 3 4 5 6 7 8 9]
'''
3.3、zeros函数
创建一个指定形状的数组,所有元素初始化为0。
numpy.zeros(shape, dtype=float, order='C')
| 参数 | 描述 |
|---|---|
| shape | 一个整数或整数元组,用于指定输出数组的形状 |
| dtype | 可选参数,指定数组元素的数据类型。默认为 float |
| order | 可选参数,指定数组数据在内存中的存储顺序。‘C’ 表示按行(C语言风 格),‘F’ 表示按列(Fortran风格) |
import numpy as nparr1=np.zeros(10)print(arr1)'''
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
'''
import numpy as nparr2=np.zeros((3,3))print(arr2)'''
[[0. 0. 0.][0. 0. 0.][0. 0. 0.]]
'''
3.4、ones函数
创建一个指定形状的数组,所有元素初始化为1。
numpy.ones(shape, dtype=float, order='C')
| 参数 | 描述 |
|---|---|
| shape | 一个整数或整数元组,用于指定输出数组的形状 |
| dtype | 可选参数,指定数组元素的数据类型。默认为 float |
| order | 可选参数,指定数组数据在内存中的存储顺序。‘C’ 表示按行(C语言风 格),‘F’ 表示按列(Fortran风格) |
import numpy as nparr1=np.ones(10)
arr2=np.ones((3,3))print(f'arr1==={arr1}')
print()
print(f'arr2==={arr2}')'''
arr1===[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]arr2===[[1. 1. 1.][1. 1. 1.][1. 1. 1.]]
'''
3.5、empty函数
创建一个指定形状的数组,未初始化,元素值可能是随机的。
numpy.empty(shape, dtype=float, order='C')
| 参数 | 描述 |
|---|---|
| shape | 一个整数或整数元组,用于指定输出数组的形状 |
| dtype | 可选参数,指定数组元素的数据类型。默认为 float |
| order | 可选参数,指定数组数据在内存中的存储顺序。‘C’ 表示按行(C语言风 格),‘F’ 表示按列(Fortran风格) |
import numpy as nparr1=np.empty(10)
arr2=np.empty((3,3))print(f'arr1==={arr1}')
print()
print(f'arr2==={arr2}')'''
arr1===[2.09197419e-076 1.87725413e-009 1.41866238e+161 3.56792062e-0575.42801934e-096 5.98147383e-154 3.98454986e+252 5.12981117e-1151.02245668e-259 2.25563609e-153]arr2===[[0.0000000e+000 0.0000000e+000 0.0000000e+000][0.0000000e+000 0.0000000e+000 3.1224949e-321][0.0000000e+000 0.0000000e+000 3.2845213e-287]]
'''
3.6、full函数
创建一个指定形状的数组,所有元素初始化为用户定义的值。
numpy.full(shape, fill_value, dtype=None, order='C')
| 参数 | 描述 |
|---|---|
| shape | 一个整数或整数元组,用于指定输出数组的形状 |
| fill_value | 用于填充数组的值 |
| dtype | 可选,指定数组元素的数据类型。如果未指定,则从 fill_value 推 断。 |
| order | 可选,指定数组数据在内存中的存储顺序。‘C’ 表示按行优先顺序;‘F’ 表 示按列优先顺序。 |
import numpy as nparr1=np.full(10,10)
arr2=np.full((3,3),3)print(f'arr1==={arr1}')
print()
print(f'arr2==={arr2}')'''
arr1===[10 10 10 10 10 10 10 10 10 10]arr2===[[3 3 3][3 3 3][3 3 3]]
'''
3.7、eye函数
创建一个单位矩阵(对角线为1,其余为0)。
eye(N, M=None, k=0, dtype=<class 'float'>, order='C')
| 参数 | 描述 |
|---|---|
| N | 矩阵的行数。如果只指定 N,则返回一个 N×N 的单位矩阵 |
| M | 矩阵的列数。如果指定,返回一个形状为 (N, M) 的矩阵 |
| k | 对角线的偏移量。k 为 0 时返回主对角线的单位矩阵;k > 0 时返回主对角线上方的对角线;k < 0 时返回主对角线下方的对角线 |
| dtype | 可选,指定数组元素的数据类型。如果未指定,则从 fill_value 推 断。 |
| order | 可选,指定数组数据在内存中的存储顺序。‘C’ 表示按行优先顺序;‘F’ 表 示按列优先顺序。 |
import numpy as nparr1=np.eye(10)
arr2=np.eye(3,3)print(f'arr1===\n{arr1}')
print()
print(f'arr2===\n{arr2}')'''
arr1===
[[1. 0. 0. 0. 0. 0. 0. 0. 0. 0.][0. 1. 0. 0. 0. 0. 0. 0. 0. 0.][0. 0. 1. 0. 0. 0. 0. 0. 0. 0.][0. 0. 0. 1. 0. 0. 0. 0. 0. 0.][0. 0. 0. 0. 1. 0. 0. 0. 0. 0.][0. 0. 0. 0. 0. 1. 0. 0. 0. 0.][0. 0. 0. 0. 0. 0. 1. 0. 0. 0.][0. 0. 0. 0. 0. 0. 0. 1. 0. 0.][0. 0. 0. 0. 0. 0. 0. 0. 1. 0.][0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]]arr2===
[[1. 0. 0.][0. 1. 0.][0. 0. 1.]]
'''
3.8、linspace函数
创建一个均匀分布的数组,包含指定数量的值。
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
| 参数 | 描述 |
|---|---|
| start | 序列的起始值 |
| stop | 序列的终止值,如果endpoint为true,该值包含于数列中 |
| num | 要生成的等步长的样本数量,默认为50 |
| endpoint | 该值为 ture 时,数列中中包含stop值,反之不包含,默认是True。 |
| retstep | 如果为 True 时,生成的数组中会显示间距,反之不显示。 |
| dtype | ndarray 的数据类型 |
import numpy as nparr1=np.linspace(10,100,20)
arr2=np.linspace(3,3)print(f'arr1===\n{arr1}')
print()
print(f'arr2===\n{arr2}')'''
arr1===
[ 10. 14.73684211 19.47368421 24.21052632 28.9473684233.68421053 38.42105263 43.15789474 47.89473684 52.6315789557.36842105 62.10526316 66.84210526 71.57894737 76.3157894781.05263158 85.78947368 90.52631579 95.26315789 100. ]arr2===
[3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3.3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3.3. 3.]
'''
3.9、logspace函数
创建一个对数均匀分布的数组,指定范围的对数数值。
np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)
| 参数 | 描述 |
|---|---|
| start | 序列的起始值为:base ** start |
| stop | 序列的终止值为:base ** stop。如果endpoint为true,该值包含于数列中 |
| num | 要生成的等步长的样本数量,默认为50 |
| endpoint | 该值为 ture 时,数列中中包含stop值,反之不包含,默认是True。 |
| base | 对数 log 的底数。 |
| dtype | ndarray 的数据类型 |
import numpy as nparr1=np.logspace(10,100,10)
arr2=np.logspace(3,3)print(f'arr1===\n{arr1}')
print()
print(f'arr2===\n{arr2}')'''
arr1===
[1.e+010 1.e+020 1.e+030 1.e+040 1.e+050 1.e+060 1.e+070 1.e+080 1.e+0901.e+100]arr2===
[1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000.1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000.1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000.1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000. 1000.1000. 1000.]
'''
四、随机数组的创建
| 函数 | 说明 |
|---|---|
| seed | 确定随机生成器种子 |
| rand | 产生均匀分布的样本值 |
| random(size=None) | 该方法返回[0.0, 1.0)范围的随机数。 |
| randn(d0,d1,…,dn) | randn函数返回一个或一组样本,具有标准正态分布(期望为0,方差为1)。dn表格每个维度,返回值为指定维度的array |
| normal | 用于从具有指定平均值(mean)和标准差(standard deviation)的正态分 布(也称为高斯分布)中抽取样本。 |
| randint | 该方法有三个参数low、high、size三个参数。默认high是None,如果只有low,那范围就是[0,low)。如果有high,范围就是[low,high)。 |
| uniform | 该函数用于从均匀分布中抽取一个浮点数 |
| shuffle | 对一个序列就地随机排列 |
4.1、seed函数
随机数种子(random seed)是一个用于初始化随机数生成器(random number generator, RNG)的值。在计算机科学中,大多数的随机数生成器实际上是伪随机 数生成器(pseudo-random number generators, PRNGs),它们通过一个算法来 生成一系列看似随机的数字。伪随机数生成器的特点是可以重现生成的随机数序列, 这是通过设置相同的随机数种子来实现的。
设置随机数种子,种子值可以是任何整数,通常是正整数。
特点:
1. 可重现性:通过设置相同的随机数种子,每次程序运行时生成的随机数序列都是 相同的。这对于调试程序、进行科学计算或模拟时保持实验结果的一致性非常有 用。
2. 算法确定性:伪随机数生成器是确定性的,这意味着给定的种子会总是产生相同 的随机数序列,这与真正的随机数生成器不同,后者总会生成不同的随机数。
3. 种子来源:随机数种子的值可以是任意的。在许多编程环境中,如果不显式设置 种子,通常会使用当前时间作为种子,这样每次程序运行时都会产生不同的随机 数序列。
4. 跨平台差异:不同的操作系统或硬件平台可能会产生不同的随机数序列,即使种 子相同。这是因为不同的平台可能有不同的PRNG算法。
import numpy as np
np.random.seed(42)
4.2、rand函数
生成均匀分布的随机数(0到1之间),可以指定形状。
numpy.random.rand(d0, d1, ..., dn)
| 函数 | 说明 |
|---|---|
| d0, d1, ..., dn | 这些参数定义了输出数组的形状。它们是整数,指定了每个 维度的大小。例如,d0 是第一个维度的大小,d1 是第二个维度的大小,依此类 推。 |
import numpy as nparr1=np.random.rand(10)print(f'arr1===\n{arr1}')'''
arr1===
[0.92463939 0.94486905 0.74476479 0.25784553 0.85425486 0.571607250.95990865 0.36395052 0.41709035 0.82599918]
'''
4.3、random函数
与 rand 类似,但提供更灵活的随机数生成。
numpy.random.random(size=None)
| 函数 | 说明 |
|---|---|
| size | 这是一个可选参数,用于指定输出数组的形状。它可以是一个整数,也 可以是一个元组。如果 size 是一个整数,则返回一个一维数组;如果 一个元组,则返回一个多维数组,其形状与元组指定的一致 |
import numpy as nparr1=np.random.random(10)arr2=np.random.random((3,3))print(f'arr1===\n{arr1}')
print()
print(f'arr2===\n{arr2}')'''
arr1===
[0.62721499 0.21350623 0.83140219 0.41729457 0.70818569 0.550753530.57016909 0.42416555 0.11372102 0.7405065 ]arr2===
[[0.96151613 0.96612422 0.49951694][0.9377553 0.61001206 0.88551393][0.22225505 0.51794861 0.36731721]]
'''
4.4、randn函数
生成标准正态分布(均值为0,标准差为1)的随机数。
numpy.random.randn(d0, d1, ..., dn)
| 函数 | 说明 |
|---|---|
| d0, d1, ..., dn | 这些参数指定了输出数组的维度。如果你只提供一个数字, 它将返回一个一维数组;如果你提供多个数字,它将返回一个多维数组,其中每 个维度的大小由对应的参数指定 |
import numpy as nparr1=np.random.randn(10)arr2=np.random.randn(3,4)print(f'arr1===\n{arr1}')
print()
print(f'arr2===\n{arr2}')'''
arr1===
[-0.49202485 -0.26029324 0.46349285 -1.4871595 -1.15332575 0.48229266-1.04077328 0.52712378 -0.40422044 1.82175024]arr2===
[[ 0.0348239 0.96843211 0.41392382 0.51399037][ 1.13157601 -1.35735621 -2.2765836 -0.52266114][-0.8062335 -0.55222009 -1.00520723 -1.84433436]]
'''
4.5、normal函数
生成给定均值和标准差的正态分布随机数。
numpy.random.normal(loc=0.0, scale=1.0, size=None)
| 函数 | 说明 |
|---|---|
| loc | 正态分布的均值,对应于分布的中心位置,默认值为 0.0 |
| scale | 正态分布的标准差,对应于分布的宽度,默认值为 1.0 |
| size | 输出数组的形状。如果是一个整数,返回一维数组。如果是一个元组,返回多维数组。默认为None返回一个随机数 |
import numpy as nparr1=np.random.normal(size=10)arr2=np.random.normal(size=(3,4))print(f'arr1===\n{arr1}')
print()
print(f'arr2===\n{arr2}')'''
arr1===
[-0.23383662 0.97632058 0.48245764 -1.71405263 0.0625902 2.32371938-1.16770879 0.20876465 -2.16149186 -0.05048533]arr2===
[[-0.68925419 -2.12716386 -1.06562238 1.11568077][ 0.02078178 -0.31270599 -1.90545882 -0.850884 ][ 0.66213069 2.28670915 -0.88748761 0.13641803]]
'''
4.6、randint函数
生成指定范围内的随机整数。
numpy.random.randint(low, high=None, size=None, dtype=int)
| 函数 | 说明 |
|---|---|
| low | 生成随机数的起始点(包含)。如果只提供了low参数而没有提供high参数,那么随机整数的范围将是从 0 到low (不包含 low本身) |
| high | 生成随机数的结束点(不包含) |
| size | 定义输出数组形状的整数或元组。例如,size(m,n)将生成 一个 m 行 n 列的数组 |
| dtype | 指定返回数组的数据类型,默认为int |
import numpy as nparr1=np.random.randint(0,10,size=10)arr2=np.random.randint(0,10,size=(3,4))print(f'arr1===\n{arr1}')
print()
print(f'arr2===\n{arr2}')'''
arr1===
[3 1 3 7 2 7 0 5 4 8]arr2===
[[4 7 9 6][3 8 2 0][2 0 4 5]]'''
4.7、uniform函数
生成指定范围内的均匀分布随机数。
numpy.random.uniform(low=0.0, high=1.0, size=None)
| 函数 | 说明 |
|---|---|
| low | 浮点数或类似浮点数的数组,表示样本抽取区间的下限,默认值为 0 |
| high | 浮点数或类似浮点数的数组,表示样本抽取区间的上限,默认值为 1 |
| size | 整数或元组,可选参数,表示输出的形状。如果未提供,则返回单个浮 点数。如果提供了一个整数,则返回一个一维数组;如果提供了一个元组,则返 回一个多维数组 |
import numpy as nparr1=np.random.uniform(0,10,size=5)arr2=np.random.uniform(0,10,size=(3,4))print(f'arr1===\n{arr1}')
print()
print(f'arr2===\n{arr2}')'''
arr1===
[7.96891358 0.19647614 5.42047937 1.49001317 9.04060667]arr2===
[[3.44988119 0.82911361 7.53272753 2.65165757][6.13385131 2.30715477 0.73983801 7.05093042][5.82714561 2.25635848 3.37875838 8.62424195]]
'''
4.8、shuffle函数
对数组进行随机重排,原地改变数组顺序。
numpy.random.shuffle(x)
| 函数 | 说明 |
|---|---|
| x | 要打乱的数组 |
import numpy as nparr1=np.array([[1,2,3],[4,5,6],[7,8,9]
])
print('改变之前')
print(f'arr1===\n{arr1}')np.random.shuffle(arr1)print('改变之后')
print(f'arr1===\n{arr1}')'''
arr1===
改变之前
arr1===
[[1 2 3][4 5 6][7 8 9]]
改变之后
arr1===
[[1 2 3][7 8 9][4 5 6]]'''
五、数组的索引和切片
Ndarray数组中的元素是可以被修改的,如果需要访问或者修改Ndarray数组某个位 置的元素,则需要使用Ndarray数组的索引来完成;如果需要访问或者修改一些区域 的元素,则需要使用Ndarray数组的切片。
5.1、一维数组的索引与切片
5.1.1、索引
一维数组的索引方式与Python列表的索引方式类似,Ndarray数组使用方括号 行索引,索引值从左向右从0开始,从右向左从-1开始。
# 一维数组的索引方式
import numpy as np# 创建了一个一维数组
arr = np.array([1, 2, 3, 4, 5])
print(arr[0])
print(arr[4])
print(arr[-1])
print(arr[-3])
arr[0] = 10
print(arr)
'''
1
5
5
3
[10 2 3 4 5]
'''
5.1.2、切片
与Python列表的切片方式类似,使用冒号:进行切片,格式为 start:stop:step, 其中start、stop、step可根据情况省略。
# 一维数组的切片方式
import numpy as nparr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])arr1 = arr[4:7]
print('arr1数组元素为', arr1)arr2 = arr[1:6:2]
print('arr2数组元素为', arr2)# 将一个标量值赋值给一个切片时,该值会自动传播到整个选区。
arr[4:7] = 6
print('arr数组元素为:', arr)# 也可以使用:代表全部元素
arr[:] = 10
print('arr数组元素为:', arr)arr[:4] = 1
print(arr)'''
arr1数组元素为 [5 6 7]
arr2数组元素为 [2 4 6]
arr数组元素为: [ 1 2 3 4 6 6 6 8 9 10]
arr数组元素为: [10 10 10 10 10 10 10 10 10 10]
[ 1 1 1 1 10 10 10 10 10 10]
'''
5.2、多维数组的索引与切片
5.2.1、索引
对于多维数组,可以通过逗号分隔的索引来访问特定元素,也可以使用连续的[]来访 问特定元素,例如,对于一个二维数组,第一个索引表示行,第二个索引表示列。
# 二维数组的索引
import numpy as nparr = np.array([[1, 2, 3], [4, 5, 6]])print('arr数组为:\n', arr)# 只有一个索引指标时,会在第0维上索引,后面的维度保持不变
print('arr[0]为:', arr[0])# 两个索引指标
print('arr[0][0]为:', arr[0][0])
print(arr[0][0])# 两个索引指标
print('arr[0, 1]为:', arr[0, 1])arr[0][2] = 5
print(arr)
'''
arr数组为:[[1 2 3][4 5 6]]
arr[0]为: [1 2 3]
arr[0][0]为: 1
1
arr[0, 1]为: 2
[[1 2 5][4 5 6]]
'''
5.2.2、切片
多维数组切片时,可以分别为每个维度指定切片。
# 二维数组的切片
import numpy as nparr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print('arr: \n', arr)# 选择特定的一行
row1 = arr[1]
print(row1)# 选择连续的多行
rows = arr[1:3]
print(rows)# 选择不连续的多行
rows = arr[[0, 2]]
print(rows)# 选择特定的一列
col1 = arr[:, 1]
print(col1)# 选择连续的多列
cols = arr[:, 1:3]
print(cols)# 选择不连续的多列
cols = arr[:, [0, 2]]
print(cols)# 同时选择行和列
subset = arr[1:3, 1:3]
print(subset)
'''arr: [[1 2 3][4 5 6][7 8 9]]
[4 5 6]
[[4 5 6][7 8 9]]
[[1 2 3][7 8 9]]
[2 5 8]
[[2 3][5 6][8 9]]
[[1 3][4 6][7 9]]
[[5 6][8 9]]'''
六、数组的属性
6.1、shape
通过调用Ndarray.shape即可返回一个表示数组维度大小的元组。
import numpy as nparr1 = np.array([[1, 2, 3], [4, 5, 6]])print(arr1)
print(arr1.shape)'''
[[1 2 3][4 5 6]]
(2, 3)
'''
6.2、dtype
通过调用Ndarray.dtype即可返回一个Ndarray数组中元素的数据类型。
import numpy as np# 可以在创建的时候去指定数据类型
arr1 = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.float32)print(arr1)
print(arr1.dtype)'''
[[1. 2. 3.][4. 5. 6.]]
float32
'''
6.3、size
该属性是指数组中包含的元素个数,其大小等于调用shape函数返回的元组中的所有 元素的乘积。
import numpy as nparr1 = np.array([[1, 2, 3], [4, 5, 6]])print(arr1)
print(arr1.shape)
print(arr1.size)'''
[[1 2 3][4 5 6]]
(2, 3)
6
'''
6.4、ndim
该属性是指数组的维度大小,其大小等于调用shape函数返回的元组中的元素的个数。
import numpy as nparr1 = np.array([[[[1, 2, 3], [4, 5, 6]]]])print(arr1)
print(arr1.shape)
print(arr1.ndim)
'''
[[[[1 2 3][4 5 6]]]]
(1, 1, 2, 3)
4
'''
七、改变数组的数据类型和形状
7.1、数据类型的修改
numpy.ndarray.astype(dtype, order='K', casting='unsafe', subok=True, copy=True)
| 函数 | 说明 |
|---|---|
| dtype | 表示新数据类型的对象。这可以是 NumPy 的 dtype 对象,也可以是 Python 的数据类型,例如 int 或 float |
| order | 一个字符,指定结果的内存布局。 按列(Fortran风格), 'C' 表示按行(C风格), 'F' 表示 'A' 或 'K' 表示在内存中的顺序与原数组保持一致 |
| casting | 控制数据类型转换的安全性。它可以是 'no'、 'equiv'、 'safe'、 'same_kind' 或 'unsafe' 之一 。 |
| subok | 如果为True,子类将被传递,否则返回的数组将强制转换为基类数组 |
| copy | 布尔值,指定是否复制数据。 |
casting参数说明:
'no':表示根本不应该进行转换数据类型。
'equiv':允许数值上等价的类型转换,即转换前后数据的位表示相同。这意味着转 换不会导致数据丢失。
'safe':允许安全的类型转换,即转换过程中不会丢失信息。
'same_kind':允许相同数据类型类别内的转换。例如,允许整型和整型之间、浮点 型和浮点型之间的转换,但是不允许整型和浮点型之间的转换。
'unsafe':允许任何类型的转换,不考虑是否会导致数据丢失或改变。这是最不安全 的选项,因为它可能会静默地丢弃数据。
比如:
从 int64 到 int32 的转换:
'no':不允许。
'equiv':不允许。
'safe':不允许。
'same_kind':允许。
'unsafe':允许。
从 float64 到 int32 的转换:
'no':不允许,因为会丢失小数部分。
'equiv'、'safe'、'same_kind':不允许,因为这不是数值上等价或安全的转换。
'unsafe':允许,但会丢失小数部分。
import numpy as np# 创建一个浮点数数组
arr = np.array([1.1, 2.2, 3.3])# 使用 astype 方法将数组转换为整数类型
new_arr = arr.astype(np.int32)print("Original array:", arr)
print("old type:", arr.dtype)
print("New array:", new_arr)
print("new type:", new_arr.dtype)
'''
Original array: [1.1 2.2 3.3]
old type: float64
New array: [1 2 3]
new type: int32
'''
7.2、形状的修改
7.2.1、reshape
reshape方法用于给数组一个新的形状而不改变其数据,它返回一个新的数组,但是 如果给定的形状与原始数组的数据不兼容,会抛出异常
numpy.ndarray.reshape(newshape, order='C')
| 函数 | 说明 |
|---|---|
| newshape | 整数或整数元组,新的形状应该与原始数组中的元素数量相匹配 |
| order | 可选参数,‘C’ 表示按行(C-style),‘F’ 表示按列(Fortran-style),‘A’ 表示原数组内存顺序,‘K’ 表示元素在内存中的出现顺序 |
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6]])
print(a)
print('shape--a', a.shape)b = a.reshape((3, 2))
print(a)
print(b)
print('shape--b',b.shape)
'''
[[1 2 3][4 5 6]]
shape--a (2, 3)
[[1 2 3][4 5 6]]
[[1 2][3 4][5 6]]
shape--b (3, 2)'''
7.2.2、resize
resize 方法用于改变数组的大小,与 reshape类似,但它会直接修改调用它的原始数 组。如果新形状大于原始形状,则会在数组的末尾添加新的元素,这些元素的值未定 义;如果新形状小于原始形状,则会截断数组。
numpy.ndarray.resize(newshape)
| 函数 | 说明 |
|---|---|
| newshape | 整数或整数元组,新的形状。 |
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6]])
print(a)
print('before:', a.shape)a.resize((3, 2))print('after:', a.shape)
print(a)a.resize((2, 2))
print(a)a.resize((5, 5))
print(a)'''
[[1 2 3][4 5 6]]
before: (2, 3)
after: (3, 2)
[[1 2][3 4][5 6]]
[[1 2][3 4]]
[[1 2 3 4 0][0 0 0 0 0][0 0 0 0 0][0 0 0 0 0][0 0 0 0 0]]'''
7.2.3、flatten
flatten方法返回一个一维数组,它是原始数组的拷贝,它默认按行顺序展平数组,但 可以通过参数 order 来指定展平顺序。
numpy.ndarray.flatten(order='C')
| 函数 | 说明 |
|---|---|
| order | 可选参数,‘C’ 表示按行,‘F’ 表示按列,‘A’ 或 ‘K’ 表示与原数组相同的顺序 |
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
print(a)
b = a.flatten()
print(b)
b[0] = 10
print(a)
print(b)
'''
[[ 1 2 3][ 4 5 6][ 7 8 9][10 11 12]]
[ 1 2 3 4 5 6 7 8 9 10 11 12]
[[ 1 2 3][ 4 5 6][ 7 8 9][10 11 12]]
[10 2 3 4 5 6 7 8 9 10 11 12]
'''
7.2.4、ravel
ravel方法返回一个连续的数组,它尝试以最低的复制操作来返回展平后的数组
numpy.ndarray.ravel(order='C')
| 函数 | 说明 |
|---|---|
| order | 可选参数,‘C’ 表示按行,‘F’ 表示按列 |
ravel和flatten的区别:
flatten 方法返回的是原数组的副本。这意味着返回的新数组与原数组是两个独 立的对象,对新数组的修改不会影响原数组。
ravel 方法返回的是原数组的视图(view)或副本(copy),这取决于数组的 顺序。如果数组是连续的(C-style,行优先),则 ravel 返回的是视图,这意 味着对返回数组的修改会影响到原数组。如果数组不是连续的,则 的是副本。可以通过传递 order='F' 参数来请求列优先的视图。
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6]])
b = a.flatten()
c = a.ravel()
d = a.ravel(order='F')a[0][0] = 100
a[1][0] = 50
print('a', a)
print('b', b)
print('c', c)
print('d', d)'''
a [[100 2 3][ 50 5 6]]
b [1 2 3 4 5 6]
c [100 2 3 50 5 6]
d [1 4 2 5 3 6]
'''
7.2.5、T
Ndarray 对象的 T 属性是一个特殊的属性,它返回数组的转置(transpose)。
转置是一个操作,它将数组的维度进行交换。对于二维数组,这意味着行变为列,列 变为行。对于更高维度的数组,转置操作涉及到交换数组的轴。
import numpy as np# 创建一个二维数组
arr_2d = np.array([[1, 2], [3, 4], [5, 6]])# 获取转置
transposed_arr = arr_2d.Tprint(" array:")
print(arr_2d)
print("T array:")
print(transposed_arr)'''array:
[[1 2][3 4][5 6]]
T array:
[[1 3 5][2 4 6]]
'''
八、数组的运算
8.1、标量和数组的运算
8.1.1、加法运算
import numpy as np# 生成一个2行3列的Ndarray数组
arr = np.array([[1, 2, 3], [4, 5, 6]])# 数组加上标量,会使数组的每一个元素都加上该标量得到一个新数组
b = arr + 2print('original: \n', arr)
print('new: \n', b)'''
original: [[1 2 3][4 5 6]]
new: [[3 4 5][6 7 8]]
'''
8.1.2、减法运算
import numpy as np# 生成一个2行3列的Ndarray数组
arr = np.array([[1, 2, 3], [4, 5, 6]])# 数组加上标量,会使数组的每一个元素都加上该标量得到一个新数组
b = arr - 2print('original: \n', arr)
print('new: \n', b)'''
original: [[1 2 3][4 5 6]]
new: [[-1 0 1][ 2 3 4]]
'''
8.1.3、乘法运算
import numpy as np# 生成一个2行3列的Ndarray数组
arr = np.array([[1, 2, 3], [4, 5, 6]])# 数组加上标量,会使数组的每一个元素都加上该标量得到一个新数组
b = arr * 2print('original: \n', arr)
print('new: \n', b)'''
original: [[1 2 3][4 5 6]]
new: [[ 2 4 6][ 8 10 12]]
'''
8.1.4、除法运算
import numpy as np# 生成一个2行3列的Ndarray数组
arr = np.array([[1, 2, 3], [4, 5, 6]])# 数组加上标量,会使数组的每一个元素都加上该标量得到一个新数组
b = arr / 2print('original: \n', arr)
print('new: \n', b)'''
original: [[1 2 3][4 5 6]]
new: [[0.5 1. 1.5][2. 2.5 3. ]]
'''
8.2、数组和数组的运算
8.2.1、加法运算
8.2.1.1、符号
import numpy as nparr1 = np.array([[11, 12, 13], [14, 15, 16]])
arr2 = np.array([[1, 2, 3], [4, 5, 6]])arr3 = arr1 + arr2print(arr1)
print(arr2)
print('运算的结果为:\n', arr3)'''
[[11 12 13][14 15 16]]
[[1 2 3][4 5 6]]
运算的结果为:[[12 14 16][18 20 22]]
'''
8.2.1.2、函数
numpy.add(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True)
| 函数 | 说明 |
|---|---|
| x1 | 第一个输入数组或标量 |
| x2 | 第二个输入数组或标量 |
| out | 输出数组,数据类型必须与预期输出相符。如果提供,它必须具有与输出 相同形状的适当类型来接收结果 |
| where | 表示计算加法的条件,如果设置为True,则在相应位置进行计算;如果 设置为False,则在相应位置不进行计算 |
| casting | 定义如何处理数据类型转换,例如 ‘no’, ‘equiv’, ‘safe’, ‘same_kind’, ‘unsafe’ |
| order | 指定结果的内存布局,‘C’ 表示 C 风格,‘F’ 表示 Fortran 风格,‘A’ 表示原 数组样式,‘K’ 表示元素在内存中的出现顺序 |
| dtype | 指定输出数组的类型 |
| subok | 控制返回数组是否可以是输入数组的子类 |
import numpy as nparr1 = np.array([[11, 12, 13], [14, 15, 16]])
arr2 = np.array([[1, 2, 3], [4, 5, 6]])arr3 = np.add(arr1,arr2)print(arr1)
print(arr2)
print('运算的结果为:\n', arr3)'''
[[11 12 13][14 15 16]]
[[1 2 3][4 5 6]]
运算的结果为:[[12 14 16][18 20 22]]
'''
8.2.2、减法运算
8.2.2.1、符号
import numpy as nparr1 = np.array([[11, 12, 13], [14, 15, 16]])
arr2 = np.array([[1, 2, 3], [4, 5, 6]])arr3 = arr1 - arr2print(arr1)
print(arr2)
print('运算的结果为:\n', arr3)'''
[[11 12 13][14 15 16]]
[[1 2 3][4 5 6]]
运算的结果为:[[10 10 10][10 10 10]]'''
8.2.2.2、函数
numpy.subtract(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True)
| 函数 | 说明 |
|---|---|
| x1 | 第一个输入数组或标量 |
| x2 | 第二个输入数组或标量 |
| out | 输出数组,数据类型必须与预期输出相符。如果提供,它必须具有与输出 相同形状的适当类型来接收结果 |
| where | 表示计算加法的条件,如果设置为True,则在相应位置进行计算;如果 设置为False,则在相应位置不进行计算 |
| casting | 定义如何处理数据类型转换,例如 ‘no’, ‘equiv’, ‘safe’, ‘same_kind’, ‘unsafe’ |
| order | 指定结果的内存布局,‘C’ 表示 C 风格,‘F’ 表示 Fortran 风格,‘A’ 表示原 数组样式,‘K’ 表示元素在内存中的出现顺序 |
| dtype | 指定输出数组的类型 |
| subok | 控制返回数组是否可以是输入数组的子类 |
import numpy as nparr1 = np.array([[11, 12, 13], [14, 15, 16]])
arr2 = np.array([[1, 2, 3], [4, 5, 6]])arr3 = np.subtract(arr1,arr2)print(arr1)
print(arr2)
print('运算的结果为:\n', arr3)'''
[[11 12 13][14 15 16]]
[[1 2 3][4 5 6]]
运算的结果为:[[10 10 10][10 10 10]]
'''
8.2.3、乘法运算
8.2.3.1、符号
import numpy as nparr1 = np.array([[11, 12, 13], [14, 15, 16]])
arr2 = np.array([[1, 2, 3], [4, 5, 6]])arr3 = arr1 * arr2print(arr1)
print(arr2)
print('运算的结果为:\n', arr3)'''
[[11 12 13][14 15 16]]
[[1 2 3][4 5 6]]
运算的结果为:[[11 24 39][56 75 96]]'''
8.2.3.2、函数
numpy.multiply(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True)
| 函数 | 说明 |
|---|---|
| x1 | 第一个输入数组或标量 |
| x2 | 第二个输入数组或标量 |
| out | 输出数组,数据类型必须与预期输出相符。如果提供,它必须具有与输出 相同形状的适当类型来接收结果 |
| where | 表示计算加法的条件,如果设置为True,则在相应位置进行计算;如果 设置为False,则在相应位置不进行计算 |
| casting | 定义如何处理数据类型转换,例如 ‘no’, ‘equiv’, ‘safe’, ‘same_kind’, ‘unsafe’ |
| order | 指定结果的内存布局,‘C’ 表示 C 风格,‘F’ 表示 Fortran 风格,‘A’ 表示原 数组样式,‘K’ 表示元素在内存中的出现顺序 |
| dtype | 指定输出数组的类型 |
| subok | 控制返回数组是否可以是输入数组的子类 |
import numpy as nparr1 = np.array([[11, 12, 13], [14, 15, 16]])
arr2 = np.array([[1, 2, 3], [4, 5, 6]])arr3 = np.multiply(arr1,arr2)print(arr1)
print(arr2)
print('运算的结果为:\n', arr3)'''
[[11 12 13][14 15 16]]
[[1 2 3][4 5 6]]
运算的结果为:[[11 24 39][56 75 96]]
'''
8.2.4、除法运算
8.2.4.1、符号
import numpy as nparr1 = np.array([[11, 12, 13], [14, 15, 16]])
arr2 = np.array([[1, 2, 3], [4, 5, 6]])arr3 = arr1 / arr2print(arr1)
print(arr2)
print('运算的结果为:\n', arr3)'''
[[11 12 13][14 15 16]]
[[1 2 3][4 5 6]]
运算的结果为:[[11. 6. 4.33333333][ 3.5 3. 2.66666667]]
'''
8.2.4.2、函数
numpy.divide(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True)
| 函数 | 说明 |
|---|---|
| x1 | 第一个输入数组或标量 |
| x2 | 第二个输入数组或标量 |
| out | 输出数组,数据类型必须与预期输出相符。如果提供,它必须具有与输出 相同形状的适当类型来接收结果 |
| where | 表示计算加法的条件,如果设置为True,则在相应位置进行计算;如果 设置为False,则在相应位置不进行计算 |
| casting | 定义如何处理数据类型转换,例如 ‘no’, ‘equiv’, ‘safe’, ‘same_kind’, ‘unsafe’ |
| order | 指定结果的内存布局,‘C’ 表示 C 风格,‘F’ 表示 Fortran 风格,‘A’ 表示原 数组样式,‘K’ 表示元素在内存中的出现顺序 |
| dtype | 指定输出数组的类型 |
| subok | 控制返回数组是否可以是输入数组的子类 |
import numpy as nparr1 = np.array([[11, 12, 13], [14, 15, 16]])
arr2 = np.array([[1, 2, 3], [4, 5, 6]])arr3 = np.divide(arr1,arr2)print(arr1)
print(arr2)
print('运算的结果为:\n', arr3)'''
[[11 12 13][14 15 16]]
[[1 2 3][4 5 6]]
运算的结果为:[[11. 6. 4.33333333][ 3.5 3. 2.66666667]]
'''
8.2.5、开根号
8.2.5.1、符号
import numpy as np# 生成一个2行3列的数组
arr1 = np.array([[4, 9, 16], [25, 36, 49]])# 开根号操作就是让一个数组进行0.5次方的幂运算
arr2 = arr1 ** 0.5print(arr1)
print('运算的结果为:\n', arr2)'''
[[ 4 9 16][25 36 49]]
运算的结果为:[[2. 3. 4.][5. 6. 7.]]
'''
8.2.5.2、函数
| 函数 | 说明 |
|---|---|
| x1 | 第一个输入数组或标量 |
| x2 | 第二个输入数组或标量 |
| out | 输出数组,数据类型必须与预期输出相符。如果提供,它必须具有与输出 相同形状的适当类型来接收结果 |
| where | 表示计算加法的条件,如果设置为True,则在相应位置进行计算;如果 设置为False,则在相应位置不进行计算 |
| casting | 定义如何处理数据类型转换,例如 ‘no’, ‘equiv’, ‘safe’, ‘same_kind’, ‘unsafe’ |
| order | 指定结果的内存布局,‘C’ 表示 C 风格,‘F’ 表示 Fortran 风格,‘A’ 表示原 数组样式,‘K’ 表示元素在内存中的出现顺序 |
| dtype | 指定输出数组的类型 |
| subok | 控制返回数组是否可以是输入数组的子类 |
import numpy as np# 生成一个2行3列的数组
arr1 = np.array([[4, 9, 16], [25, 36, 49]])# 开根号操作就是让一个数组进行0.5次方的幂运算
arr2 = np.pow(arr1,0.5)print(arr1)
print('运算的结果为:\n', arr2)'''
[[ 4 9 16][25 36 49]]
运算的结果为:[[2. 3. 4.][5. 6. 7.]]
'''
8.2.6、点积
行*列
| 函数 | 说明 |
|---|---|
| a | 第一个输入数组 |
| b | 第二个输入数组 |
| out | 可选输出数组,用于放置运算结果 |
import numpy as np# 生成两个2行3列的数组
arr1 = np.array([[1,2,3],[4,5,6],[7,8,9]]
)
arr2 = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9]]
)# power会使arr1中的每个元素为底数,arr2中的对应位置的元素为指数进行运算
arr3 = np.dot(arr1, arr2)print(arr1)
print(arr2)
print('运算的结果为:\n', arr3)'''
[[1 2 3][4 5 6][7 8 9]]
[[1 2 3][4 5 6][7 8 9]]
运算的结果为:[[ 30 36 42][ 66 81 96][102 126 150]]
'''
九、数组的广播机制
通常情况下,为了进行元素级的算术运算,两个数组的形状必须完全一致,Numpy的广播机制,它提供了一种规则,能够将不同形状的两个计算数 组广播到相同形状,然后再去进行元素级的算术运算,这种规则使得形状不完全匹配 的数组也能相互运算。通过这个机制,Numpy能够在保持效率的同时,扩展数组的 操作范围,从而无需显式地扩展数组维度或进行循环遍历以实现元素级的计算,极大的增强了数组的处理能力。
具体规则为:
1. 如果两个数组的维数不同,形状较小的数组会在前面补1。
2. 如果两个数组的形状在某个维度上不匹配,且其中一个维度长度为1,则会沿该 维度复制扩展以匹配另一个数组的形状。
3. 如果在任一维度上不匹配且没有维度等于1,则会引发异常。
举例:
arr = np.array([[1, 2, 3], [4, 5, 6]])
arr和标量2进行相加
标量 2 的形状可以看作是(),而二维数组 arr的形状是(2, 3)。根据广播 规则,维度较低的标量会在其形状左边添加与高维数组相同的维度数,使其维度与高 维数组相同。这里标量 2 被扩展为形状(1,1)的数组,再进一步扩展为形状(2,3) 的数组,即 [[2,2,2],[2,2,2]]。然后,这个扩展后的数组与原二维数组 arr进行 对应元素的运算。所以最终结果为:
arr + 2 = [[1+2,2+2,3+2],[4+2,5+2,6+2]] = [[3,4,5],[6,7,8]]
十、修改维度
10.1、squeeze
该函数的作用是从数组形状中删除所有单维度的条目,即把形状中为1的维度去掉。
numpy.squeeze(a, axis=None)
| 函数 | 说明 |
|---|---|
| a | 输入数组。它可以是任何形状的数组,但至少有一个维度的大小为1。 |
| axis | 可选参数。一个整数或整数元组。如果指定了该参数,则只压缩指定的 轴。如果该轴在数组 a 中不是单维度的,则不会进行压缩。如果未指定,则所有 单维度的轴都将被压缩。 |
# squeeze: 降维
import numpy as np# 创建一个具有单维度的数组
arr = np.array([[[1], [2], [3]]])
print(arr)
print("原始数组形状:", arr.shape)# 使用squeeze函数去掉所有单维度的条目
squeezed_arr = np.squeeze(arr, axis=(0, 2))
print(squeezed_arr)
print("压缩后的数组形状:", squeezed_arr.shape)'''
[[[1][2][3]]]
原始数组形状: (1, 3, 1)
[1 2 3]
压缩后的数组形状: (3,)
'''
10.2、expand_dims
该函数的作用是在指定的位置增加一个单一维度,即在指定的位置增加一个形状为1 的维度。
numpy.expand_dims(a, axis)
| 函数 | 说明 |
|---|---|
| a | 输入数组。它可以是任何形状的数组,但至少有一个维度的大小为1。 |
| axis | 可选参数。一个整数或整数元组。如果指定了该参数,则只压缩指定的 轴。如果该轴在数组 a 中不是单维度的,则不会进行压缩。如果未指定,则所有 单维度的轴都将被压缩。 |
# expand_dims:升维
import numpy as np# 创建一个一维数组
arr = np.array([[1, 2, 3], [4, 5, 6]])
print("原始数组形状:", arr.shape)
print(arr)# 在位置0增加一个维度
expanded_arr = np.expand_dims(arr, axis=2)
print("增加维度后的数组形状:", expanded_arr.shape)
print(expanded_arr)# 在位置1增加一个维度
expanded_arr = np.expand_dims(arr, axis=(0, 1))
print("增加维度后的数组形状:", expanded_arr.shape)
print(expanded_arr)
'''
原始数组形状: (2, 3)
[[1 2 3][4 5 6]]
增加维度后的数组形状: (2, 3, 1)
[[[1][2][3]][[4][5][6]]]
增加维度后的数组形状: (1, 1, 2, 3)
[[[[1 2 3][4 5 6]]]]
'''
十一、连接数组
11.1、concatenate
该函数用于将多个数组沿指定的轴连接起来,形成一个更大的数组
numpy.concatenate((a1, a2, ..., arr_n), axis=0, out=None)
| 函数 | 说明 |
|---|---|
| (a1, a2, ..., arr_n) | 这是一个包含数组的元组,这些数组需要被连接。所 有数组在除了连接轴之外的其他维度上必须有相同的形状 |
| axis | 整数,指定沿着哪个轴进行连接。如果不指定,默认为 0,表示第一个 轴。 |
| out | 可选参数,如果提供,结果将直接存储在这个数组中。这个数组必须具有 与输入数组相同的形状和数据类型。 |
工作原理:
1. 输入验证: concatenate 接受一个元组或列表作为输入,其中包含一系列数 组。这些数组可以是任意维度,但它们在除了要连接的轴之外的所有维度上必须 具有相同的形状。
2. 轴参数: concatenate 有一个必需的参数 axis,它指定了沿着哪个轴进行连 接。轴的编号从 0 开始,对于一维数组,只有一个轴(轴 0)。对于二维数组, 轴 0 是行,轴 1 是列。
3. 形状兼容性检查:所有输入数组在 axis 参数指定的轴上的维度大小可以不同, 但在其他轴上的维度大小必须相同。例如,如果 axis=1,则所有输入数组的行 数必须相同。
4. 内存分配:在连接之前, concatenate 会计算输出数组的大小,并分配足够的 内存空间来存储结果。
5. 数据复制: concatenate 会将输入数组的数据复制到新分配的内存空间中。具 体来说,它将沿着指定的轴顺序地复制每个数组的数据,从而形成一个新的数 组。
6. 结果数组:输出结果是一个新的数组,它在 axis 指定的轴上的维度大小是所有 输入数组在该轴上维度大小的总和,而在其他轴上则与输入数组相同。
import numpy as np# 创建两个数组
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6]])print(f'数组a的形状为{a.shape}, 数组a为:\n', a)
print(f'数组b的形状为{b.shape}, 数组b为:\n', b)# 沿着第一个轴(垂直方向)连接数组
c = np.concatenate((b, a), axis=0)
print(f'数组c的形状为{c.shape}, 数组c为:\n', c)# 沿着第二个轴(水平方向)连接数组
d = np.concatenate((a, b.T), axis=1)
print(f'数组b的转置的形状为{b.T.shape}, 数组b的转置为:\n', b.T)
print(f'数组d的形状为{d.shape}, 数组d为:\n', d)'''
数组a的形状为(2, 2), 数组a为:[[1 2][3 4]]
数组b的形状为(1, 2), 数组b为:[[5 6]]
数组c的形状为(3, 2), 数组c为:[[5 6][1 2][3 4]]
数组b的转置的形状为(2, 1), 数组b的转置为:[[5][6]]
数组d的形状为(2, 3), 数组d为:[[1 2 5][3 4 6]]
'''
11.2、stack
该函数用于沿着新的轴连接一系列数组。与 numpy.concatenate 不同, numpy.stack 总是创建一个新的轴,而numpy.concatenate则是在现有轴上进行数组的连接
numpy.stack(arrays, axis=0, out=None)
| 函数 | 说明 |
|---|---|
| arrays | 一系列数组,它们将被堆叠在一起。所有数组必须具有相同的形状 |
| axis | 整数,表示新轴的位置。默认值为 0 |
| out | 可选参数,如果提供,结果将直接存储在这个数组中。这个数组必须具有 与输出数组相同的形状和数据类型 |
工作原理:
1. 输入验证: stack 接受一个数组序列(例如一个列表或元组)作为输入。所有输 入数组必须具有相同的形状。
2. 轴参数: stack 有一个必需的参数 axis,它指定了新轴的位置。
3. 形状兼容性检查:所有输入数组在除了要创建的新轴外的所有维度上必须具有相 同的形状。
4. 内存分配: stack 会计算输出数组的形状,并在内存中为这个新数组分配空间。 新数组的形状将比输入数组的形状多一个维度,这个新增的维度的大小等于输入 数组的数量。
5. 数据复制: stack 将输入数组的数据复制到新分配的内存空间中,每个输入数组 在新轴上占据一个位置。
6. 结果数组:输出结果是一个新的数组,其形状在 一个维度。
import numpy as np# 创建两个一维数组
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = np.array([7, 8, 9])print(f'数组a的形状为{a.shape}, 数组a为:\n', a)
print(f'数组b的形状为{b.shape}, 数组b为:\n', b)# # 沿着新的轴堆叠数组
d = np.stack((a, c, b), axis=0)
print(f'数组d的形状为{d.shape}, 数组d为:\n', d)# 沿着第二个轴堆叠数组
e = np.stack((a, b), axis=1)
print(f'数组e的形状为{e.shape}, 数组e为:\n', e)'''
数组a的形状为(3,), 数组a为:[1 2 3]
数组b的形状为(3,), 数组b为:[4 5 6]
数组d的形状为(3, 3), 数组d为:[[1 2 3][7 8 9][4 5 6]]
数组e的形状为(3, 2), 数组e为:[[1 4][2 5][3 6]]
'''
11.3、hstack
在 NumPy 中, numpy.hstack(水平堆叠)函数用于沿着水平方向堆叠数组序列。
numpy.hstack(tup)
| 函数 | 说明 |
|---|---|
| tup | 一个数组序列,它们将被水平堆叠在一起。所有数组在除了第二个轴之外 的轴上必须具有相同的形状。 |
工作原理:
1. 输入验证:首先, hstack 会检查所有输入数组是否都是二维的,或者至少可以 被视为二维的。如果输入数组是多维的,它们将被重新塑造为二维数组。
2. 形状兼容性检查:所有输入数组在除了第二个轴(列)之外的所有其他轴上必须 有相同的形状。这意味着,如果输入数组是一系列的矩阵,那么这些矩阵的行数 必须相同。例如,如果你有两个矩阵 A 和 B,它们分别是 3x2 和 3x3 的,那么它 们可以在水平方向上堆叠,因为它们都有 3 行。
3. 堆叠操作:如果输入数组通过了形状兼容性检查, hstack 将沿着第二个轴 (列)将它们连接起来。这意味着,对于每个输入数组,它们的列将被依次排列 在一起。
4. 结果数组:输出结果是一个新的二维数组,其列数是所有输入数组列数的总和, 而行数与输入数组中的任何一个相同。
import numpy as np# 创建两个 2x2 的矩阵
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])print(f'数组a的形状为{a.shape}, 数组a为:\n', a)
print(f'数组b的形状为{b.shape}, 数组b为:\n', b)# 使用 hstack 进行水平堆叠
c = np.hstack((a, b))# 输出结果
print(f'数组c的形状为{c.shape}, 数组c为:\n', c)'''
数组a的形状为(2, 2), 数组a为:[[1 2][3 4]]
数组b的形状为(2, 2), 数组b为:[[5 6][7 8]]
数组c的形状为(2, 4), 数组c为:[[1 2 5 6][3 4 7 8]]'''
11.4、vstack
numpy.vstack函数用于将多个数组沿垂直方向(即沿着第一个轴,axis=0)堆叠成 一个单一的数组
numpy.vstack(tup)
| 函数 | 说明 |
|---|---|
| tup | 一个包含数组的元组或列表。所有数组在除了第一个轴外的维度上必须具 有相同的形状 |
工作原理:
1. 输入验证: vstack 接受一个数组序列(例如一个列表或元组)作为输入。所有 输入数组在除了第一个轴外的所有其他维度上必须具有相同的形状。
2. 内存分配: vstack 会计算输出数组的形状,并在内存中为这个新数组分配空 间。输出数组的第一个维度将是所有输入数组第一个维度大小的总和,其他维度 与输入数组相同。
3. 数据复制: vstack 将输入数组的数据复制到新分配的内存空间中,每个输入数 组在新数组中占据连续的块。
4. 结果数组:输出结果是一个新的数组,其中输入数组沿第一个轴(垂直方向)堆 叠。
import numpy as np# 创建两个二维数组
a = np.array([[1, 2, 3],[4, 5, 6]])
b = np.array([[7, 8, 9]])print(f'数组a的形状为{a.shape}, 数组a为:\n', a)
print(f'数组b的形状为{b.shape}, 数组b为:\n', b)# 使用 vstack 进行垂直堆叠
c = np.vstack((a, b))# 输出结果
print(f'数组c的形状为{c.shape}, 数组c为:\n', c)'''
数组a的形状为(2, 3), 数组a为:[[1 2 3][4 5 6]]
数组b的形状为(1, 3), 数组b为:[[7 8 9]]
数组c的形状为(3, 3), 数组c为:[[1 2 3][4 5 6][7 8 9]]'''
十二、分割数组
12.1、split
该函数用于沿着指定的轴将数组分割成多个子数组,可以指定要分割的数组、分割的 位置或子数组的数量。
numpy.split(ary, indices_or_sections, axis=0)
| 函数 | 说明 |
|---|---|
| ary | 要分割的数组 |
| indices_or_sections | 可以是一个整数,表示要将数组平均分割成多少个子 数组;也可以是一个整数数组,表示分割的位置 |
| axis | 沿着哪个轴进行分割,默认为 0,即第一个轴 |
工作原理:
1. 输入验证: split 接受一个数组 参数 ary 作为输入,以及一个指示如何分割数组的 indices_or_sections。如果提供了 axis 参数,它指定了沿哪个轴分割 数组,默认为 0。
2. 解析分割参数:如果 indices_or_sections 是一个整数,它表示要将数组分割成多少个大小相等的子数组。如果是一个序列,它表示沿指定轴的分割点。
3. 计算分割点:如果indices_or_sections是整数,split 会计算每个子数组应该包含的元素数量。如果indices_or_sections是一个序列,则直接使用这些值作为分割点。
4. 执行分割:split 使用计算出的分割点在指定轴上将原始数组分割成多个子数 组。这通常涉及到创建原始数组的视图,而不是复制数据。
5. 返回结果: split 返回一个列表,其中包含所有分割后的子数组。
# split
import numpy as np# 创建一个一维数组
a = np.array([1, 2, 3, 4, 5, 6])# 使用 split 平均分割数组为 3 个子数组
result1 = np.split(a, 3, axis=0)# 使用 split 按位置分割数组
result2 = np.split(a, [1, 2, 4])# 输出结果
print("平均分割为 3 个子数组:", result1)
print("按位置分割:", result2)'''
平均分割为 3 个子数组: [array([1, 2]), array([3, 4]), array([5, 6])]
按位置分割: [array([1]), array([2]), array([3, 4]), array([5, 6])]
'''
12.2、hsplit
numpy.hsplit 用于沿着横向(水平方向)将数组分割成多个子数组。这个函数是 numpy.split 的一个特化版本,专门用于沿着第二个轴(axis=1)进行分割。
numpy.hsplit(ary, indices_or_sections)
| 函数 | 说明 |
|---|---|
| ary | 要分割的数组 |
| indices_or_sections | 可以是一个整数,表示要将数组平均分割成多少个子 数组;也可以是一个整数数组,表示分割的位置 |
工作原理:
1. 输入验证: hsplit 接受一个数组ary作为输入,以及一个指示如何分割数组的参数indices_or_sections。与 split 不同,hsplit 不接受axis 参数,因为它默认沿着第二个轴(axis=1)进行分割。
2. 解析分割参数:如果 indices_or_sections 是一个整数,它表示要将数组分割成多少个大小相等的子数组。如果是一个序列,它表示沿指定轴的分割点。
3. 计算分割点:如果 indices_or_sections 是整数, hsplit 会计算每个子数组 在水平方向上应该包含的列数。如果 indices_or_sections 是一个序列,则直 接使用这些值作为分割点。
4. 执行分割: hsplit 使用计算出的分割点在第二个轴上将原始数组分割成多个子 数组。与 split 类似,这通常涉及到创建原始数组的视图,而不是复制数据。
5. 返回结果: hsplit 返回一个列表,其中包含所有分割后的子数组。每个子数组 都是原始数组的一部分,沿第二个轴分割而成。
import numpy as np# 创建一个 6x4 的二维数组
arr = np.arange(24).reshape(6, 4)# 打印原始数组
print("原始数组:")
print(arr)# 指定每部分应该包含的列数
col_counts = [1, 2]# 使用 hsplit 分割数组
subarrays = np.hsplit(arr, col_counts)# 打印分割后的子数组
print("\n分割后的子数组:")
print(subarrays)
'''
原始数组:
[[ 0 1 2 3][ 4 5 6 7][ 8 9 10 11][12 13 14 15][16 17 18 19][20 21 22 23]]分割后的子数组:
[array([[ 0],[ 4],[ 8],[12],[16],[20]]), array([[ 1],[ 5],[ 9],[13],[17],[21]]), array([[ 2, 3],[ 6, 7],[10, 11],[14, 15],[18, 19],[22, 23]])]
'''
12.3、vsplit
numpy.vsplit 用于沿着纵向(垂直方向)将数组分割成多个子数组。这个函数是 numpy.split 的一个特化版本,专门用于沿着第一个轴(axis=0)进行分割。
numpy.vsplit(ary, indices_or_sections)
| 函数 | 说明 |
|---|---|
| ary | 要分割的数组 |
| indices_or_sections | 可以是一个整数,表示要将数组平均分割成多少个子 数组;也可以是一个整数数组,表示分割的位置 |
工作原理:
1. 输入验证: vsplit 接受一个数组 参数 ary 作为输入,以及一个指示如何分割数组的 indices_or_sections。与 split 不同, vsplit 不接受 为它默认沿着第一个轴(axis=0)进行分割。
2. 解析分割参数:如果 axis 参数,因 indices_or_sections 是一个整数,它表示要将数组在垂 直方向上平均分割成多少个子数组。如果是一个序列,它表示沿第一个轴的分割 点。
3. 计算分割点:如果 indices_or_sections 是整数, vsplit 会计算每个子数组 在垂直方向上应该包含的行数。如果 indices_or_sections 是一个序列,则直 接使用这些值作为分割点。
4. 执行分割: vsplit 使用计算出的分割点在第一个轴上将原始数组分割成多个子 数组。与 split 类似,这通常涉及到创建原始数组的视图,而不是复制数据。
5. 返回结果: vsplit 返回一个列表,其中包含所有分割后的子数组。每个子数组 都是原始数组的一部分,沿第一个轴分割而成。
import numpy as np# 创建一个 6x4 的二维数组
arr = np.arange(24).reshape(6, 4)# 打印原始数组
print("原始数组:")
print(arr)# 指定每部分应该包含的列数
col_counts = [1, 2]# 使用 hsplit 分割数组
subarrays = np.vsplit(arr, col_counts)# 打印分割后的子数组
print("\n分割后的子数组:")
print(subarrays)'''
原始数组:
[[ 0 1 2 3][ 4 5 6 7][ 8 9 10 11][12 13 14 15][16 17 18 19][20 21 22 23]]分割后的子数组:
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11],[12, 13, 14, 15],[16, 17, 18, 19],[20, 21, 22, 23]])]
'''
十三、元素的添加与删除
13.1、append
numpy.append(arr, values, axis=None)
| 函数 | 说明 |
|---|---|
| arr | 原始数组,可以是任何形状 |
| values | 要追加的值,它们会被追加到arr的末尾。values的形状必须与arr 在除了要追加的轴之外的所有轴上兼容。 |
| axis | 可选参数,指定要追加值的轴。如果axis没有被指定, arr 会被展平,values 会被追加到结果数组的末尾。 |
注意事项:
1、numpy.append 在追加元素时,如果 arr 的形状。
2、如果 values 是一个数组,它的形状必须与 values 是一个标量,它会自动广播以匹配 arr 在除了要追加的轴之外的所有 轴上匹配。
3、numpy.append 可能不是最高效的操作,因为它涉及到创建一个新的数组。如果 频繁追加元素,考虑使用 numpy.concatenate 或 numpy.append 的替代方法, 如使用 numpy.resize 和直接赋值。
import numpy as np# 创建一个一维数组
arr = np.array([[1, 2, 3], [4, 5, 6]])# 要追加的值
values = np.array([[1, 2, 3]])# 使用 numpy.append 追加值
result = np.append(arr, values, axis=0)# 输出结果
print(result)
'''
[[1 2 3][4 5 6][1 2 3]]'''
import numpy as nparr_2d = np.array([[1, 2], [3, 4]])# 要追加的值
values_2d = np.array([[5], [6]])# 使用 numpy.append 追加值,沿着列方向
result_2d = np.append(arr_2d, values_2d, axis=1)# 输出结果
print(result_2d)
'''
[[1 2 5][3 4 6]]
'''
13.2、insert
该函数用于在数组的指定位置插入元素。与 numpy.append 不同的是, numpy.insert 允许用户在数组的任意位置插入元素,而不仅仅是数组的末尾。
numpy.insert(arr, obj, values, axis=None)
| 函数 | 说明 |
|---|---|
| arr | 原始数组,可以是任何形状。 |
| obj | 表示插入位置的索引。它可以是整数或者整数数组。如果是整数,则表示 在哪个位置插入。如果是整数数组,则表示在哪些位置插入。 |
| values | 要插入的值。如果 arr 是多维数组,则 axis 指定的轴以外的所有轴上与 arr 保持一致。 |
| axis | 可选参数,指定插入操作的轴。如果未指定,则 values 会被插入到一维数组中。 |
注意事项:
1、如果 obj 是一个整数数组,values也会被分割成多个部分每个部分被插入到 对应的索引位置。
2、如果 values 是一个标量,它会自动广播以匹配需要插入的位置。
3、插入操作可能会比追加操作更加低效,因为它涉及到数组元素的移动。
import numpy as np# 创建一个一维数组
arr = np.array([1, 2, 3, 4, 5])
print(arr)result = np.insert(arr, 2, 10)print(result)# 在索引 [1, 3] 的位置插入值 [20, 30]
result_2 = np.insert(arr, [1, 3], [20, 10])# 输出结果
print(result_2)
'''
[1 2 3 4 5]
[ 1 2 10 3 4 5]
[ 1 20 2 3 10 4 5]
'''
import numpy as np
# 在二维数组中插入值
arr_2d = np.array([[1, 2], [3, 4], [5, 6]])
print(arr_2d)values = np.array([[5], [6], [7]])# 在索引 0 的位置沿着列方向插入值 [10]
result_2d = np.insert(arr_2d, [0], values, 1)# 输出结果
print(result_2d)
'''
[[1 2][3 4][5 6]]
[[5 1 2][6 3 4][7 5 6]]
'''
13.3、delete
该函数用于从数组中删除指定的子数组,并返回一个新的数组。这个函数允许用户删 除数组中的单个元素或多个连续的元素。
numpy.delete(arr, obj, axis=None)
| 函数 | 说明 |
|---|---|
| arr | 原始数组,可以是任何形状。 |
| obj | 表示要删除的子数组的索引。它可以是单个整数、一个整数列表或一个整 数数组。如果是一个整数,它表示要删除单个元素的位置;如果是列表或数组, 则表示要删除多个元素的位置。 |
| axis | 可选参数,指定删除操作的轴。如果未指定,则 arr 会被展平,然后根 据 obj 指定的索引删除元素。 |
注意事项:
1、如果 obj 是一个列表或数组,删除操作会按照索引的顺序进行,这意味着删除 操作可能会影响后续索引的位置。
2、如果 obj 中的索引超出数组的范围, numpy.delete 会抛出一个异常。
import numpy as np# 创建一个一维数组
arr = np.array([1, 2, 3, 4, 5])# 删除索引 2 的元素
result = np.delete(arr, 2)# 输出结果
print(result)# 删除索引 [1, 3] 的元素
result_2 = np.delete(arr, [1, 3])# 输出结果
print(result_2)
'''
[1 2 4 5]
[1 3 5]
'''
import numpy as np# 在二维数组中删除元素
arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])# 删除索引 1 的列
result_2d = np.delete(arr_2d, 0, axis=0)# 输出结果
print(result_2d)
'''
[[4 5 6][7 8 9]]
'''# 删除索引 [0, 2] 的行
result_2d_row = np.delete(arr_2d, [0, 2], axis=0)# 输出结果
print(result_2d_row)
'''
[[4 5 6]]
'''
十四、统计计算
14.1、mean
该函数用于计算数组中元素的平均值。它可以计算整个数组的平均值,也可以沿着指 定的轴(axis)计算平均值。
numpy.mean(a, axis=None, dtype=None, out=None, keepdims=<no value>)
| 函数 | 说明 |
|---|---|
| a | 输入数组,可以是任何形状的数组。 |
| axis | 可选参数,用于指定计算平均值的轴。如果没有指定,则计算整个数组 的平均值。如果指定了轴,则计算该轴上元素的平均值。 |
| dtype | 可选参数,用于指定返回的平均值的数据类型。如果没有指定,则通常 返回与输入数组相同的数据类型。 |
| out | 可选参数,如果提供,结果会直接写入到这个数组中。这个数组必须具有 正确的形状。 |
| keepdims | 可选参数,如果设置为 True,则计算后的和会保留原始数组的维度,其值默认为False |
import numpy as np# 创建一个一维数组
arr = np.array([1, 2, 3, 4, 5])# 计算整个数组的平均值
mean_arr = np.mean(arr)# 输出结果
print(mean_arr)# 创建一个二维数组
arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr_2d)# 计算整个二维数组的平均值
mean_arr_2d = np.mean(arr_2d)# 输出结果
print(mean_arr_2d)# 计算二维数组沿着列的平均值
mean_arr_2d_col = np.mean(arr_2d, axis=0)# 输出结果
print(mean_arr_2d_col)# 计算二维数组沿着行的平均值
mean_arr_2d_row = np.mean(arr_2d, axis=1)# 输出结果
print(mean_arr_2d_row)# 使用 keepdims=True 保留维度
mean_arr_2d_row_keepdims = np.mean(arr_2d, axis=1, keepdims=True)# 输出结果
print(mean_arr_2d_row_keepdims)a = np.array([np.nan, 1, 2, 3])
b = np.mean(a)
print(b)'''
3.0
[[1 2 3][4 5 6][7 8 9]]
5.0
[4. 5. 6.]
[2. 5. 8.]
[[2.][5.][8.]]
nan
'''
14.2、sum
该函数用于计算数组中所有元素的和,或者沿指定轴计算元素的和。
numpy.sum(a, axis=None, dtype=None, out=None, keepdims=<no value>, initial=<no value>, where=<no value>)
| 函数 | 说明 |
|---|---|
| a | 输入数组,可以是任何形状的数组。 |
| axis | 可选参数,用于指定计算和的轴。如果没有指定,则计算整个数组的 和。如果指定了轴,则计算该轴上元素的和。可以是整数或元组,用于指定多个 轴。 |
| dtype | 可选参数,指定返回和的数据类型。如果未指定,则通常与输入数组的 类型相同,除非输入数组为布尔型,此时默认返回 int64 或 int32。 |
| out | 可选参数,如果提供,结果会直接写入到这个数组中。这个数组必须具有 正确的形状。 |
| keepdims | 可选参数,如果设置为 True,则计算后的和会保留原始数组的维度,其值默认为False |
| initial | 可选参数,如果提供,则用于指定当数组为空时的初始值。 |
| where | 可选参数,用于指定计算和的条件。 |
import numpy as nparr = np.array([[1, 2, 3], [4, 0, 6], [7, 8, 9]])
print(arr)# 计算整个数组的和
total_sum = np.sum(arr)
print(total_sum)# 计算每一列的和
sum_col = np.sum(arr, axis=0, keepdims=True)
print(sum_col)# 计算每一行的和
sum_row = np.sum(arr, axis=1)
print(sum_row)# 保留原始维度
sum_row_keep = np.sum(arr, axis=1, keepdims=True)
print(sum_row_keep)
'''
[[1 2 3][4 0 6][7 8 9]]
40
[[12 10 18]]
[ 6 10 24]
[[ 6][10][24]]
'''
14.3、max和min
numpy.max 和 numpy.min 是 NumPy 库中用于计算数组中元素最大值和最小值的函数
numpy.max(a, axis=None, out=None, keepdims=<no value>, initial=<no value>, where=<no value>)
numpy.min(a, axis=None, out=None, keepdims=<no value>, initial=<no value>, where=<no value>)
| 函数 | 说明 |
|---|---|
| a | 输入数组,可以是任何形状的数组。 |
| axis | 可选参数,用于指定计算最小值、最大值的轴。如果没有指定,则计算整个数组 的最小值、最大值。如果指定了轴,则计算该轴上元素的最小值、最大值。 |
| out | 可选参数,如果提供,结果会直接写入到这个数组中。这个数组必须具有 正确的形状。 |
| keepdims | 可选参数,如果设置为 True,则计算后的最小值、最大值会保留原始数组的维度,其默认值为False |
| initial | 可选参数,如果提供,则用于指定当数组为空时的初始值。 |
| where | 可选参数,用于指定计算最小值、最大值的条件。 |
import numpy as nparr = np.array([[1, 2, 3], [4, 0, 6], [7, 8, 9]])
print(arr)# 计算整个数组的最大值
max_val = np.min(arr)
print(max_val)# 计算每一列的最大值
max_val_col = np.min(arr, axis=0)
print(max_val_col)# 计算每一行的最大值
max_val_row = np.min(arr, axis=1)
print(max_val_row)
'''
[[1 2 3][4 0 6][7 8 9]]
0
[1 0 3]
[1 0 7]
'''
14.4、var
numpy.var 用于计算数组中所有元素或沿指定轴的方差。方差是衡量一组数值分散 程度的统计量,它是各个数值与其平均数差的平方的平均数。
numpy.var(a, axis=None, dtype=None, out=None, keepdims=<no value>)
| 函数 | 说明 |
|---|---|
| a | 输入数组,可以是任何形状的数组。 |
| axis | 可选参数,用于指定计算方差的轴。如果没有指定,则计算整个数组的 方差。如果指定了轴,则计算该轴上元素的方差。可以是整数或元组,用于指定 多个轴。 |
| dtype | 可选参数,指定返回方差的数据类型。如果未指定,则通常与输入数组 的类型相同。 |
| out | 可选参数,如果提供,结果会直接写入到这个数组中。这个数组必须具有 正确的形状。 |
| keepdims | 可选参数,如果设置为True,则计算后的方差会保留原始数组的维度,其值默认为False |
import numpy as nparr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr)# 计算整个数组的方差
total_var = np.var(arr)
print(total_var)# 计算每一列的方差
var_col = np.var(arr, axis=0)
print(var_col)
# 计算每一行的方差
var_row = np.var(arr, axis=1)
print(var_row)
'''
[[1 2 3][4 5 6][7 8 9]]
6.666666666666667
[6. 6. 6.]
[0.66666667 0.66666667 0.66666667]
'''
14.5、std
numpy.std 用于计算数组中所有元素的标准差,或者沿着指定轴计算标准差。标准 差是方差的平方根,它也是一种衡量数据分散程度的统计量。
numpy.std(a, axis=None, dtype=None, out=None, keepdims=<no value>)
| 函数 | 说明 |
|---|---|
| a | 输入数组,可以是任何形状的数组。 |
| axis | 可选参数,用于指定计算标准差的轴。如果没有指定,则计算整个数组 的标准差。如果指定了轴,则计算该轴上元素的标准差。可以是整数或元组,用 于指定多个轴。 |
| dtype | 可选参数,指定返回标准差的数据类型。如果未指定,则通常与输入数 组的类型相同。 |
| out | 可选参数,如果提供,结果会直接写入到这个数组中。这个数组必须具有 正确的形状。 |
| keepdims | 可选参数,如果设置为True,则计算后的标准差会保留原始数组的维度,其值默认为False |
import numpy as nparr = np.array([[1, 2, 3]])total_var = np.var(arr)
print(total_var)
# 计算整个数组的标准差
total_std = np.std(arr)
print(total_std)
# 计算每一列的标准差
std_col = np.std(arr, axis=0)# 计算每一行的标准差
std_row = np.std(arr, axis=1)print(std_col)
print(std_row)
'''
0.6666666666666666
0.816496580927726
[0. 0. 0.]
[0.81649658]
'''
14.6、argmax和argmin
numpy.argmax 和 numpy.argmin 是 NumPy 库中的两个函数,它们分别用于找出 数组中最大值和最小值的索引位置。
numpy.argmax(a, axis=None, out=None)
numpy.argmin(a, axis=None, out=None)
| 函数 | 说明 |
|---|---|
| a | 输入数组。如果数组是多维的,则沿着指定的轴搜索最大值或最小值。 |
| axis | 可选参数,用于指定搜索最大值或最小值的轴。如果没有指定,则在展 平的数组中进行搜索。如果指定了轴,则沿着该轴搜索,并返回该轴上的索引位 置。 |
| out | 可选参数,如果提供,结果会直接写入到这个数组中。这个数组必须具有 正确的形状。 |
import numpy as nparr = np.array([[1, 2, 3], [4, 0, 6], [7, 8, 9]])# 找出整个数组中的最大值和最小值的索引位置
max_index = np.argmax(arr)
min_index = np.argmin(arr)print(max_index)
print(min_index)# 找出每一列中的最大值和最小值的索引位置
max_index_col = np.argmax(arr, axis=0)
min_index_col = np.argmin(arr, axis=0)print(max_index_col)
print(min_index_col)# 找出每一行中的最大值和最小值的索引位置
max_index_row = np.argmax(arr, axis=1)
min_index_row = np.argmin(arr, axis=1)print(max_index_row)
print(min_index_row)'''
8
4
[2 2 2]
[0 1 0]
[2 2 2]
[0 1 0]
'''
十五、where函数
numpy.where 是 NumPy 库中的一个非常有用的函数,它可以根据指定的条件返回 满足该条件的元素的索引。
当 numpy.where 接受一个条件作为参数时,它会返回一个元组,其中包含满足该条 件的元素的索引。
numpy.where(condition)
| 函数 | 说明 |
|---|---|
| condition | 一个布尔数组或条件表达式。 |
| 返回值 | |
|---|---|
| 一个元组,其中包含满足条件的元素的索引。 |
import numpy as nparr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
condition = arr > 5
print(arr)result = np.where(condition)
print(result)
'''
[1 2 3 4 5 6 7 8 9]
(array([5, 6, 7, 8]),)
'''
十六、思维导图

相关文章:
Python----数据分析(Numpy:安装,数组创建,切片和索引,数组的属性,数据类型,数组形状,数组的运算,基本函数)
一、 Numpy库简介 1.1、概念 NumPy(Numerical Python)是一个开源的Python科学计算库,旨在为Python提供 高性能的多维数组对象和一系列工具。NumPy数组是Python数据分析的基础,许多 其他的数据处理库(如Pandas、SciPy)都依赖于Num…...
Leetcode-最大矩形(单调栈)
一、题目描述 给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。 输入:matrix [["1","0","1","0","0"],["1","0&…...
域内委派维权
为某个服务账户配置 krbtgt 用户的非约束性委派或基于资源的约束性委派。这里我的 krbtgt 的基于资源约束性委派我利用不了,所以使用的是域控的机器账户 dc01$ 进行维权。 抓取所有 hash。 mimikatz.exe "privilege::debug" "lsadump::dcsync /doma…...
leetcode---LCR 140.训练计划
给定一个头节点为 head 的链表用于记录一系列核心肌群训练项目编号,请查找并返回倒数第 cnt 个训练项目编号。 示例 1: 输入:head [2,4,7,8], cnt 1 输出:8 提示: 1 < head.length < 1000 < head[i] <…...
Linux基础 -- ARM 32位常用机器码(指令)整理
ARM 32位常用机器码(指令)整理 1. 数据处理指令(运算、逻辑、比较) 指令含义示例备注MOV赋值(寄存器传输)MOV R0, R1直接将 R1 复制到 R0MVN取反MVN R0, R1R0 ~R1ADD加法ADD R0, R1, R2R0 R1 R2ADC带进…...
内存中的缓存区
在 Java 的 I/O 流设计中,BufferedInputStream 和 BufferedOutputStream 的“缓冲区”是 内存中的缓存区(具体是 JVM 堆内存的一部分),但它们的作用是优化数据的传输效率,并不是直接操作硬盘和内存之间的缓存。以下是详…...
基于 Spring Boot 的 +Vue“宠物咖啡馆平台” 系统的设计与实现
大家好,今天要和大家聊的是一款基于 Spring Boot 的 “宠物咖啡馆平台” 系统的设计与实现。项目源码以及部署相关事宜请联系我,文末附上联系方式。 项目简介 基于 Spring Boot 的 “宠物咖啡馆平台” 系统设计与实现的主要使用者分为 管理员、用户 和…...
LeetCode 解题思路 7(Hot 100)
解题思路: 初始化窗口元素: 遍历前 k 个元素,构建初始单调队列。若当前索引对应值大于等于队尾索引对应值,移除队尾索引,将当前索引加入队尾。遍历结束时当前队头索引即为当前窗口最大值,将其存入结果数组…...
linux-Dockerfile及docker-compose.yml相关字段用途
文章目录 计算机系统5G云计算LINUX Dockerfile及docker-conpose.yml相关字段用途一、Dockerfile1、基础指令2、.高级指令3、多阶段构建指令 二、Docker-Compose.yml1、服务定义(services)2、高级服务配置3、网络配置 (networks)4、卷配置 (volumes)5、扩…...
deepseek部署:ELK + Filebeat + Zookeeper + Kafka
## 1. 概述 本文档旨在指导如何在7台机器上部署ELK(Elasticsearch, Logstash, Kibana)堆栈、Filebeat、Zookeeper和Kafka。该部署方案适用于日志收集、处理和可视化场景。 ## 2. 环境准备 ### 2.1 机器分配 | 机器编号 | 主机名 | IP地址 | 部署组件 |-…...
微软Office 2016-2024 x86直装版 v16.0.18324 32位
微软 Office 是一款由微软公司开发的办公软件套装,能满足各种办公需求。包含 Word、Excel、PowerPoint、Outlook 和 OneNote 等软件。Word 有强大文档编辑功能和多人协作;Excel 可处理分析大量数据及支持宏编程;PowerPoint 用于制作演示文稿且…...
CMake宏定义管理:如何优雅处理第三方库的宏冲突
在C/C项目开发中,我们常常会遇到这样的困境: 当引入一个功能强大的第三方库时,却发现它定义的某个宏与我们的项目产生冲突。比如: 库定义了 BUFFER_SIZE 1024,而我们需要 BUFFER_SIZE 2048库内部使用 DEBUG 宏控制日志…...
【SpringCloud】Gateway
目录 一、网关路由 1.1.认识网关 1.2.快速入门? 1.2.1.引入依赖 1.2.2.配置路由 二、网关登录校验 2.1.Gateway工作原理 ?2.2.自定义过滤器 2.3.登录校验 2.4.微服务获取用户 2.4.1.保存用户信息到请求头 2.4.2.拦截器获取用户? ?2.5.OpenFeign传递用户 三、…...
Maven入门教程
一、Maven简介 Maven 是一个基于项目对象模型(Project Object Model)的构建工具,用于管理 Java 项目的依赖、构建流程和文档生成。它的核心功能包括: 依赖管理(Dependency Management):自动下载和管理第三方库&#x…...
大数据与金融科技:革新金融行业的动力引擎
大数据与金融科技:革新金融行业的动力引擎 在今天的金融行业,大数据与金融科技的结合正在以惊人的速度推动着金融服务的创新与变革。通过精准的数据分析与智能化决策,金融机构能够更高效地进行风险管理、客户服务、资产管理等一系列关键操作…...
Autosar RTE配置-Port Update配置及使用-基于ETAS工具
文章目录 前言Autosar Rte中enableUpdate参数定义ETAS工具中的配置生成代码分析总结前言 在E2E校验中,需要对Counter进行自增,但每个报文周期不一样,导致自增的周期不一样。且Counter应该在收到报文之后才进行自增。基于这些需求,本文介绍使用RTE Port中的参数enableUpdat…...
【AVRCP】深入理解蓝牙音频 / 视频远程控制规范:从基础到应用
AVRCP(Audio/Video Remote Control Profile)作为蓝牙音频 / 视频控制领域的重要规范,通过其完善的协议架构、丰富的功能分类以及对用户需求的深入考量,为我们带来了便捷、高效的音频 / 视频设备控制体验。无论是在日常生活中的音乐…...
AWS SQS跨账户访问失败排查指南
引言 在使用AWS SQS(Simple Queue Service)时,跨账户访问是常见的业务场景。例如,账户A的应用程序向队列发送消息,账户B的消费者从队列拉取消息。尽管AWS官方文档明确支持此类配置,但在实际应用中,由于权限模型的复杂性,开发者和运维人员常会遇到“策略已配置但无法接…...
算法训练(leetcode)二刷第三十八天 | 1143. 最长公共子序列、1035. 不相交的线、53. 最大子数组和、392. 判断子序列
刷题记录 1143. 最长公共子序列1035. 不相交的线53. 最大子数组和动态规划优化版 392. 判断子序列 1143. 最长公共子序列 leetcode题目地址 本题和300. 最长递增子序列相似(题解)。 使用动态规划: dp数组含义:dp[i][j]表示 以…...
【JavaWeb学习Day20】
Tlias智能学习系统 员工登录 三层架构: Controller:1.接收请求参数(用户名,密码)2.调用Service方法3.响应结果 具体实现: /*** 登录*/ PostMapping("/login") public Result login(Reque…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...

