ndarray对象实质上就可以理解为矩阵, 矩阵是咱们作运算的基本单位,所以其初始化、属性调整、属性获取、基本操作都是高频使用的。
虽然是高频使用的,但有时候,莫名地就忘了格式,或者忘了还有这个操作,所以有必要写一篇博文把“Numpy库的ndarray对象初始化、属性调整、属性获取、基本操作”的示例代码进行个积累汇总,以便自己Coding时取用。
示例代码如下:
A = np.array([[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]], dtype='int8')
上面代码中的第二个参数dtype是可选的,不如不填,则系统根据矩阵元素的数据大小来确定。
上面的代码创建的是二维矩阵,我们再看一个创建三维矩阵的例子。
# !/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
B = np.array([[[11, 12, 13, 14],
[15, 16, 17, 18]],
[[19, 20, 21, 22],
[23, 24, 25, 26]],
[[27, 28, 29, 30],
[31, 32, 33, 34]]])
运行结果如下图所示:
从其shape属性可以看出,B矩阵的尺寸为三通道,两行,四列。其内容如下:
示例代码如下:
import numpy as np
B = np.array([[[11, 12, 13, 14],
[15, 16, 17, 18]],
[[19, 20, 21, 22],
[23, 24, 25, 26]],
[[27, 28, 29, 30],
[31, 32, 33, 34]]])
C = B
示例代码如下:
import numpy as np
B = np.array([[[11, 12, 13, 14],
[15, 16, 17, 18]],
[[19, 20, 21, 22],
[23, 24, 25, 26]],
[[27, 28, 29, 30],
[31, 32, 33, 34]]])
C = B
C = 0*C
C = C.astype('float32')
运行结果如下:
注意:在2中说了通过“=”赋值得到的新ndarray对象和原对象共享存储空间(浅拷贝),但由于这里使用了乘法运算符,所以会为结果构建一个新的ndarray对象,并为其分配新的存储空间,所以通过上面代码的一系列操作得到的是深拷贝。
D = np.ones((3, 5), dtype='uint8')
注意,我们还可通过函数ones()、zeros()等函数创建多维矩阵,比如我们可以通过下面这条语句创建二通道、三行、四列的三维矩阵。
D = np.ones((2, 3, 4), dtype='uint8')
运行结果如下:
从这个结果我们可以看出,第一个索引代表通道数(也称为页数),第二个索引代表行数,第三个索引代表列数。要特别注意,OpenCV的函数imread()读到的图像数据的三个索引值并不是这个顺序,详情见 https://www.hhai.cc/thread-89-1-1.html
同样,也可初始化四维矩阵,如下:
D = np.ones((2, 3, 4, 5), dtype='uint8')
E = np.zeros((3, 5), dtype='float32')
F = np.random.randint(0, 100, (3, 5), dtype='uint8')
K = np.random.randn(2, 3)
注意:函数randn()不能设置数据类型,也不能设置正态分布的均值和标准差,其原型如下:
random.randn(d0, d1, ..., dn)
运行结果如下:
从上图我们可以看出,其数据类型为float64
示例代码如下:
import numpy as np
A = np.array([[[11, 12, 13, 14],
[15, 16, 17, 18]],
[[19, 20, 21, 22],
[23, 24, 25, 26]],
[[27, 28, 29, 30],
[31, 32, 33, 34]]])
A_dim = A.ndim # 矩阵的维度
A_shape = A.shape # 矩阵的形状
A_size = A.size # 矩阵的元素个数
A_dtype = A.dtype # 矩阵的数据类型
A_itemsize = A.itemsize # 矩阵的每个元素占用的内存空间,以字节为单位
A_flags = A.flags # 矩阵数据的内存布局
A_real = A.real # 矩阵数据的实部
A_imag = A.imag # 矩阵数据的虚部
对数据的选取和访问请参看我的另一篇博文,链接:
https://www.hhai.cc/thread-122-1-1.html
关于这个问题,参见我的另一篇博文,链接如下:
https://www.hhai.cc/thread-128-1-1.html
关于ndarray对象如何转换为列表,大家可以参考我的另一篇博文,链接如下:
https://www.hhai.cc/thread-123-1-1.html