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

发布时间 2023-08-14 14:35:12作者: 霍格沃兹测试开发学社

在这里插入图片描述

NumPy相关数组操作

前言

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

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

变维操作

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

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

注:ravel修改视图会影响原数组

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

  1. 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,
  1. 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]
  1. 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:对数组的轴进行对换
  1. 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 的使用方法与其类似,这里就不再赘述

  1. numpy.rollaxis()

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

numpy.rollaxis(arr, axis, start)

参数说明:

  • arr:要传入的数组
  • axis:沿着哪条轴向后滚动,其它轴的相对位置不会改变
  • start:默认以 0 轴开始,可以根据数组维度调整它的值
  1. 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: 扩展数组的形状
  1. 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]]
  1. 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]]
  1. 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:将一个数组垂直分割为多个子数组(按行)
  1. 连接数组操作

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]]
  1. 分割数组

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中常用的数组操作,包括变维、转置、修改数组维度、连接和分割数组等。熟练掌握这些操作将使您能够更有效地处理和操作多维数组数据,提高数据处理的效率。

获取更多技术资料,请点击!