NumPy中包含了一些用于处理数组的函数,大概可分为以下几类:修改数组形状、翻转数组、修改数组维度、连接数组、分割数组、添加与删除数组元素。本节详细介绍如何修改数组形状和翻转数组。
修改数组形状的函数如下:
(1)numpy.reshape:可以在不改变数据的条件下修改形状。该函数原型如下:
numpy.reshape(arr, newshape, order='C')
其中,参数arr表示要修改形状的数组;newshape表示新的形状的整数或者整数数组,新的形状应当兼容原有形状;order表示元素出现的顺序,'C'表示按行出现,'F'表示按列出现,'A'表示按原顺序出现,'K'表示按元素在内存中的顺序出现。比如:
a = np.arange(8) print ('原始数组:') print (a) b = a.reshape(4,2) print ('修改后的数组:') print (b)
输出结果为:
原始数组: [0 1 2 3 4 5 6 7]
修改后的数组: [[0 1] [2 3] [4 5] [6 7]]
(2)numpy.ndarray.flat:一个数组元素迭代器。示例如下:
a = np.arange(9).reshape(3,3) print ('原始数组:') for row in a: print (row) #对数组中每个元素都进行处理,可以使用flat属性,该属性是一个数组元素迭代器 print ('迭代后的数组:') for element in a.flat: print (element)
输出结果如下:
原始数组: [0 1 2] [3 4 5] [6 7 8] 迭代后的数组: 0 1 2 3 4 5 6 7 8
(3)numpy.ndarray.flatten:返回一份数组副本,对副本所做的修改不会影响原始数组。该函数原型如下:
ndarray.flatten(order='C')
order表示元素出现的顺序,'C'表示按行出现,'F'表示按列出现,'A'表示按原顺序出现,'K'表示按元素在内存中的顺序出现。比如:
a = np.arange(8).reshape(2,4) print ('原数组:') print (a) # 默认按行 print ('展开的数组:') print (a.flatten()) print ('以F 风格顺序展开的数组:') print (a.flatten(order = 'F'))
输出结果如下:
原数组: [[0 1 2 3] [4 5 6 7]] 展开的数组: [0 1 2 3 4 5 6 7] 以F 风格顺序展开的数组: [0 4 1 5 2 6 3 7]
(4)numpy.ravel:该函数展平的数组元素,其顺序通常是“C风格”,返回的是数组视图(view,有点类似C/C++引用reference的意思),修改该视图会影响原始数组。函数原型如下:
numpy.ravel(a, order='C')
示例如下:
a = np.arange(8).reshape(2,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]] 调用ravel函数之后: [0 1 2 3 4 5 6 7] 以F风格顺序调用ravel函数之后: [0 4 1 5 2 6 3 7]
翻转数组的函数如下:
(1)numpy.transpose:用于对换数组的维度。该函数原型如下:
numpy.transpose(arr, axes)
其中,参数arr表示要操作的数组;axes表示整数列表,对应维度,通常所有维度都会对换。比如:
a = np.arange(12).reshape(3,4) print ('原数组:') print (a ) print ('对换数组:') print (np.transpose(a))
输出结果为:
原数组: [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] 对换数组: [[ 0 4 8] [ 1 5 9] [ 2 6 10] [ 3 7 11]]
numpy.ndarray.T类似numpy.transpose:
a = np.arange(12).reshape(3,4) print ('原数组:') print (a) print ('转置数组:') print (a.T)
输出结果为:
原数组: [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] 转置数组: [[ 0 4 8] [ 1 5 9] [ 2 6 10] [ 3 7 11]]
(2)numpy.rollaxis:向后滚动特定的轴到一个特定位置。该函数的原型如下:
numpy.rollaxis(arr, axis, start)
其中,参数arr表示数组;axis表示要向后滚动的轴,其他轴的相对位置不会改变;start默认为0,表示完整的滚动,会滚动到特定位置。比如:
# 创建了三维的ndarray a = np.arange(8).reshape(2,2,2) print ('原数组:') print (a) print ('获取数组中一个值:') print(np.where(a==6)) print(a[1,1,0]) #为6 #将轴 2 滚动到轴 0(宽度到深度) print ('调用rollaxis函数:') b = np.rollaxis(a,2,0) print (b) # 查看元素 a[1,1,0],即6的坐标,变成 [0, 1, 1] # 最后一个0 移动到最前面 print(np.where(b==6)) #将轴 2 滚动到轴 1(宽度到高度) print ('调用rollaxis函数:') c = np.rollaxis(a,2,1) print (c) # 查看元素 a[1,1,0],即6的坐标,变成 [1, 0, 1] # 最后的0和它前面的1对换位置 print(np.where(c==6)) print ('\n')
输出结果如下:
原数组: [[[0 1] [2 3]] [[4 5] [6 7]]] 获取数组中一个值: (array([1], dtype=int64), array([1], dtype=int64), array([0], dtype=int64)) 6 调用rollaxis函数: [[[0 2] [4 6]] [[1 3] [5 7]]] (array([0], dtype=int64), array([1], dtype=int64), array([1], dtype=int64)) 调用rollaxis函数: [[[0 2] [1 3]] [[4 6] [5 7]]] (array([1], dtype=int64), array([0], dtype=int64), array([1], dtype=int64))
(3)numpy.swapaxes:用于交换数组的两个轴。该函数的原型如下:
numpy.swapaxes(arr, axis1, axis2)
其中,arr表示输入的数组;axis1表示对应第一个轴的整数;axis2表示对应第二个轴的整数。比如:
# 创建了三维的ndarray a = np.arange(8).reshape(2,2,2) print ('原数组:') print (a) # 现在交换轴 0(深度方向)到轴 2(宽度方向) print ('调用swapaxes函数后的数组:') print (np.swapaxes(a, 2, 0))
输出结果为:
原数组: [[[0 1] [2 3]] [[4 5] [6 7]]] 调用swapaxes函数后的数组: [[[0 4] [2 6]] [[1 5] [3 7]]]
通过数组创建图像的示例如例4.1所示。
【例4.1】 通过数组创建图像
import numpy as np import cv2 as cv def fill_binary(): image = np.zeros([400, 400, 3], np.uint8) image[100:300, 100:300, :] = 255 cv.imshow("fill_binary", image) mask = np.ones([402, 402, 1], np.uint8) mask[101:301, 101:301] = 0 cv.floodFill(image, mask, (200, 200), (0, 0, 255), cv.FLOODFILL_MASK_ONLY) cv.imshow("filled binary", image) fill_binary() cv.waitKey(0) cv.destroyAllWindows()
运行工程,结果如图4-2所示。
图4-2