软件测试|Python科学计算神器numpy教程(八)

简介: 软件测试|Python科学计算神器numpy教程(八)

image.png

NumPy相关数组操作
前言
NumPy是Python中用于数值计算和数据处理的强大库。本文将介绍如何使用NumPy进行数组操作,包括变维、转置、修改数组维度、连接和分割数组等常用操作。

NumPy是Python中最重要的数值计算库之一,它提供了广泛的功能和工具来处理和操作多维数组。本文将向您介绍如何使用NumPy进行一些常见的数组操作,包括变维、转置、修改数组维度、连接和分割数组等。

变维操作
变维操作用于改变数组的形状,可以将数组转换为不同的维度。numpy提供了如下方法进行数组的变维:

reshape:在不改变数组元素的条件下,修改数组的形状
flat:返回一个迭代器,可以用 for 循环遍历其中的每一个元素
flatten:以一维数组的形式返回一份数组的副本,对副本的操作不会影响到原数组
ravel:返回一个连续的扁平数组(即展开的一维数组),与 flatten不同,它返回的是数组视图
注:ravel修改视图会影响原数组

reshape我们已经在之前的教程之中介绍过了,这里不做赘述。

flat
numpy.ndarray.flat 返回一个数组迭代器,实例如下:

import numpy as np
a = np.arange(12).reshape(3,4)
for row in a:
print (row)

使用flat属性:

for ele in a.flat:
print (ele,end=",")


输出结果如下:
[0 1 2 3]
[4 5 6 7]
[ 8 9 10 11]
0,1,2,3,4,5,6,7,8,9,10,11,
flatten
numpy.ndarray.flatten 返回一份数组副本,对副本修改不会影响原始数组,其语法格式如下:

ndarray.flatten(order='C')
实例如下:

import numpy as np
a = np.arange(16).reshape(4,4)
print (a)

默认按行C风格展开的数组

print (a.flatten())

以F风格顺序展开的数组

print (a.flatten(order = 'F'))


输出结果如下:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]
[ 0 4 8 12 1 5 9 13 2 6 10 14 3 7 11 15]
ravel()
numpy.ravel() 将多维数组中的元素以一维数组的形式展开,该方法返回数组的视图(view),如果修改,则会影响原始数组。语法格式如下:

numpy.ravel(a, order='C')
实例如下:

import numpy as np
a = np.arange(16).reshape(4,4)
print ('原数组:')
print (a)
print ('调用 ravel 函数后:')
print (a.ravel())
print ('F 风格顺序调用 ravel 函数之后:')
print (a.ravel(order = 'F'))


输出结果如下:
原数组:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
调用 ravel 函数后:
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]
F 风格顺序调用 ravel 函数之后:
[ 0 4 8 12 1 5 9 13 2 6 10 14 3 7 11 15]
转置操作
转置操作将数组的行和列互换。numpy提供了如下方式来进行数组的转置:

transpose:将数组的维度值进行对换,比如二维数组维度(2,4)使用该方法后为(4,2)
ndarray.T:与 transpose 方法相同
rollaxis:沿着指定的轴向后滚动至规定的位置
swapaxes:对数组的轴进行对换
numpy.transpose()
numpy.transpose() 用于对换多维数组的维度,比如二维数组使用此方法可以实现矩阵转置,语法格式如下:

numpy.transpose(arr, axes)
参数说明:

arr:要操作的数组
axes:可选参数,元组或者整数列表,将会按照该参数进行转置
示例如下:

import numpy as np
a = np.arange(16).reshape(4,4)
print (a)

print (np.transpose(a))

输出结果如下:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
[[ 0 4 8 12]
[ 1 5 9 13]
[ 2 6 10 14]
[ 3 7 11 15]]
注:ndarray.T 的使用方法与其类似,这里就不再赘述

numpy.rollaxis()
该方法表示沿着指定的轴,向后滚动至一个特定位置,格式如下:

numpy.rollaxis(arr, axis, start)
参数说明:

arr:要传入的数组
axis:沿着哪条轴向后滚动,其它轴的相对位置不会改变
start:默认以 0 轴开始,可以根据数组维度调整它的值
numpy.swapaxes()
该方法用于交换数组的两个轴,其语法格式如下:

numpy.swapaxes(arr, axis1, axis2)
示例如下:

import numpy as np

创建了三维的 ndarray

a = np.arange(27).reshape(3,3,3)
print (a)

对换0轴与2轴

print(np.swapaxes(a,2,0))

输出结果如下:
[[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]]

[[ 9 10 11]
[12 13 14]
[15 16 17]]

[[18 19 20]
[21 22 23]
[24 25 26]]]
[[[ 0 9 18]
[ 3 12 21]
[ 6 15 24]]

[[ 1 10 19]
[ 4 13 22]
[ 7 16 25]]

[[ 2 11 20]
[ 5 14 23]
[ 8 17 26]]]
修改维度
有时候,我们需要修改数组的维度,而不改变数组中的元素数量。NumPy提供了一些函数来执行这种操作。

broadcast: 生成一个模拟广播的对象
broadcast_to :将数组广播为新的形状
expand_dims: 扩展数组的形状
numpy.broadcast()
返回值是数组被广播后的对象,该函数以两个数组作为输入参数,实例如下:

import numpy as np
a = np.array([[1], [2], [3]])
b = np.array([4, 5, 6])

对b广播a

d = np.broadcast(a,b)

d它拥有 iterator 属性

r,c = d.iters
print (next(r), next(c))
print (next(r), next(c))

使用broadcast将a与b相加

e = np.broadcast(a,b)
f=np.empty(e.shape)
f.flat=[x+y for (x,y) in e]
print(f)
print(a+b)


输出结果如下:
1 4
1 5
[[5. 6. 7.]
[6. 7. 8.]
[7. 8. 9.]]
[[5 6 7]
[6 7 8]
[7 8 9]]
numpy.broadcast_to()
该函数将数组广播到新形状中,它在原始数组的基础上返回一个只读视图。 如果新形状不符合 NumPy 的广播规则,则会抛出 ValueError 异常。函数的语法格式如下:

numpy.broadcast_to(array, shape, subok)
实例如下:

import numpy as np
a = np.arange(4).reshape(1,4)
print("原数组",a)
print ('调用 broadcast_to 函数之后:')
print (np.broadcast_to(a,(4,4)))


输出结果如下:
原数组 [[0 1 2 3]]
调用 broadcast_to 函数之后:
[[0 1 2 3]
[0 1 2 3]
[0 1 2 3]
[0 1 2 3]]
numpy.expand_dims()
在指定位置插入新的轴,从而扩展数组的维度,语法格式如下:

numpy.expand_dims(arr, axis)
参数说明:

arr:输入数组
axis:新轴插入的位置
示例如下:

import numpy as np
x = np.array(([1,2],[3,4]))
print ('数组 x:')
print (x)

在 0 轴处插入新的轴

y = np.expand_dims(x, axis = 0)
print ('数组 y:')
print (y)
print ('\n')
print ('数组 x 和 y 的形状:')
print (x.shape, y.shape)


输出结果如下:
数组 x:
[[1 2]
[3 4]]
数组 y:
[[[1 2]
[3 4]]]

数组 x 和 y 的形状:
(2, 2) (1, 2, 2)
连接与分割数组
连接与分割数组是数组的两种操作方式,我们为了便于大家记忆,现将它们的方法整合在一起,如下所示:

连接数组:
concatenate:沿指定轴连接两个或者多个相同形状的数组
stack:沿着新的轴连接一系列数组
hstack:按水平顺序堆叠序列中数组(列方向)
按垂直方向堆叠序列中数组(行方向)
分割数组:
split:将一个数组分割为多个子数组
hsplit:将一个数组水平分割为多个子数组(按列)
vsplit:将一个数组垂直分割为多个子数组(按行)
连接数组操作
numpy.concatenate() 沿指定轴连接相同形状的两个或多个数组,格式如下:

numpy.concatenate((a1, a2, ...), axis)
参数说明:

a1, a2, …:表示一系列相同类型的数组
axis:沿着该参数指定的轴连接数组,默认为 0
实例说明:

import numpy as np

创建数组a

a = np.array([[10,20],[30,40]])
print (a)

创建数组b

b = np.array([[50,60],[70,80]])
print (b)

沿轴 0 连接两个数组

print (np.concatenate((a,b)))

沿轴 1 连接两个数组

print (np.concatenate((a,b),axis = 1))


输出结果如下:
[[10 20]
[30 40]]
[[50 60]
[70 80]]
[[10 20]
[30 40]
[50 60]
[70 80]]
[[10 20 50 60]
[30 40 70 80]]
数组连接操作至少需要两个维度相同的数组,才允许对它们进行垂直或者水平方向上的操作。

在垂直方向堆叠数组,示例如下:

import numpy as np
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])

垂直堆叠

c = np.vstack((a,b))
print (c)


输出结果如下:
[[1 2]
[3 4]
[5 6]
[7 8]]
分割数组
numpy.split() 沿指定的轴将数组分割为多个子数组,语法格式如下:

numpy.split(ary, indices_or_sections, axis)
参数说明:

ary:被分割的数组
indices_or_sections:若是一个整数,代表用该整数平均切分,若是一个数组,则代表沿轴切分的位置(左开右闭)
axis:默认为0,表示横向切分;为1时表示纵向切分
示例如下:

import numpy as np
a = np.arange(6)

原数组

print (a)

将数组分为二个形状大小相等的子数组

b = np.split(a,2)
print (b)

将数组在一维数组中标明要位置分割

b = np.split(a,[3,4])
print (b)


输出结果如下:

a数组

[0 1 2 3 4 5]

切分分形状大小相同的数组

[array([0, 1, 2]), array([3, 4, 5])]

按数组标明位置切分,切分时左开右闭

[array([0, 1, 2]), array([3]), array([4, 5])]
hsplit() 的使用方法,示例如下:

import numpy as np

arr1数组

arr1 = np.floor(10 * np.random.random((2, 6)))
print(arr1)

拆分后数组

print(np.hsplit(arr1, 3))


输出结果如下:
[[6. 3. 4. 4. 9. 8.]
[7. 9. 9. 0. 2. 7.]]
[array([[6., 3.],
[7., 9.]]), array([[4., 4.],
[9., 0.]]), array([[9., 8.],
[2., 7.]])]
总结
NumPy是Python中用于数值计算和数据处理的关键库之一。本文介绍了NumPy中常用的数组操作,包括变维、转置、修改数组维度、连接和分割数组等。熟练掌握这些操作将使您能够更有效地处理和操作多维数组数据,提高数据处理的效率。

相关文章
|
2月前
|
存储 Java 数据处理
(numpy)Python做数据处理必备框架!(一):认识numpy;从概念层面开始学习ndarray数组:形状、数组转置、数值范围、矩阵...
Numpy是什么? numpy是Python中科学计算的基础包。 它是一个Python库,提供多维数组对象、各种派生对象(例如掩码数组和矩阵)以及用于对数组进行快速操作的各种方法,包括数学、逻辑、形状操作、排序、选择、I/0 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。 Numpy能做什么? numpy的部分功能如下: ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。 线性代数、随机数生成以及傅里叶变换功能。 用于集成由C、C++
312 1
|
3月前
|
人工智能 数据可视化 测试技术
Postman 性能测试教程:快速上手 API 压测
本文介绍API上线后因高频调用导致服务器告警,通过Postman与Apifox进行压力测试排查性能瓶颈。对比两款工具在批量请求、断言验证、可视化报告等方面的优劣,探讨API性能优化策略及行业未来发展方向。
Postman 性能测试教程:快速上手 API 压测
|
2月前
|
Java 数据处理 索引
(numpy)Python做数据处理必备框架!(二):ndarray切片的使用与运算;常见的ndarray函数:平方根、正余弦、自然对数、指数、幂等运算;统计函数:方差、均值、极差;比较函数...
ndarray切片 索引从0开始 索引/切片类型 描述/用法 基本索引 通过整数索引直接访问元素。 行/列切片 使用冒号:切片语法选择行或列的子集 连续切片 从起始索引到结束索引按步长切片 使用slice函数 通过slice(start,stop,strp)定义切片规则 布尔索引 通过布尔条件筛选满足条件的元素。支持逻辑运算符 &、|。
162 0
|
5月前
|
JSON JavaScript 测试技术
用Postman玩转电商API:一键测试+自动化请求教程
Postman 是电商 API 测试的高效工具,涵盖基础配置、自动化测试、环境管理与请求自动化,助你快速提升开发效率。
|
4月前
|
前端开发 Java jenkins
Jmeter压力测试工具全面教程和使用技巧。
JMeter是一个能够模拟高并发请求以检查应用程序各方面性能的工具,包括但不限于前端页面、后端服务及数据库系统。熟练使用JMeter不仅能够帮助发现性能瓶颈,还能在软件开发早期就预测系统在面对真实用户压力时的表现,确保软件质量和用户体验。在上述介绍的基础上,建议读者结合官方文档和社区最佳实践,持续深入学习和应用。
898 10
|
3月前
|
监控 测试技术 API
n8n自动化测试教程 (1):环境搭建与初识n8n
n8n是一款开源、可视化的工作流自动化工具,测试工程师可通过拖拽节点快速构建API测试流程,实现测试编排、数据管理、自动化监控与告警等功能,提升测试效率与覆盖率。
|
4月前
|
机器学习/深度学习 API 异构计算
JAX快速上手:从NumPy到GPU加速的Python高性能计算库入门教程
JAX是Google开发的高性能数值计算库,旨在解决NumPy在现代计算需求下的局限性。它不仅兼容NumPy的API,还引入了自动微分、GPU/TPU加速和即时编译(JIT)等关键功能,显著提升了计算效率。JAX适用于机器学习、科学模拟等需要大规模计算和梯度优化的场景,为Python在高性能计算领域开辟了新路径。
385 0
JAX快速上手:从NumPy到GPU加速的Python高性能计算库入门教程
|
4月前
|
存储 数据采集 数据处理
Pandas与NumPy:Python数据处理的双剑合璧
Pandas与NumPy是Python数据科学的核心工具。NumPy以高效的多维数组支持数值计算,适用于大规模矩阵运算;Pandas则提供灵活的DataFrame结构,擅长处理表格型数据与缺失值。二者在性能与功能上各具优势,协同构建现代数据分析的技术基石。
363 0
|
4月前
|
JSON 安全 测试技术
什么是API接口测试?这可能是全网最全的教程了!
API 是应用程序间的“中间人”,用于实现通信和数据交换。随着微服务架构的普及,API 数量激增,其质量对系统稳定性至关重要。API 测试可验证功能、性能与安全性,帮助开发者在部署前发现并修复问题,提升系统可靠性。测试内容包括请求方法、URL、请求头、请求体、响应状态码与响应数据等。常用工具如 Postman、AREX 可辅助测试,确保 API 在不同场景下的正确性与稳定性。
|
12月前
|
敏捷开发 测试技术 持续交付
自动化测试之美:从零开始搭建你的Python测试框架
在软件开发的马拉松赛道上,自动化测试是那个能让你保持节奏、避免跌宕起伏的神奇小助手。本文将带你走进自动化测试的世界,用Python这把钥匙,解锁高效、可靠的测试框架之门。你将学会如何步步为营,构建属于自己的测试庇护所,让代码质量成为晨跑时清新的空气,而不是雾霾中的忧虑。让我们一起摆脱手动测试的繁琐枷锁,拥抱自动化带来的自由吧!

推荐镜像

更多