购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

4.11 数组操作

NumPy中包含了一些用于处理数组的函数,大概可分为以下几类:修改数组形状、翻转数组、修改数组维度、连接数组、分割数组、添加与删除数组元素。本节详细介绍如何修改数组形状和翻转数组。

4.11.1 修改数组形状

修改数组形状的函数如下:

(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]

4.11.2 翻转数组

翻转数组的函数如下:

(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 eTDgZyOyMRhcGtGXAZmw8xcHPlq+Z3IPPZ+Rmkg/C08JI/7Sr7tEE17XbKUk4gGu

点击中间区域
呼出菜单
上一章
目录
下一章
×