python使用numpy生成18种特殊数组
作者:微小冷
所有创建数组的函数中,都有一个可选参数 dtype ,表示创建的数组的数据类型。
| 指定维度 | empty, eye, identity, ones, zeros, full | 
| 模仿维度 | empty_like, ones_like, zeros_like, full_like | 
| 特殊矩阵 | diag, diagflat, tri, tril, triu, vander | 
| 数值范围 | arange, linspace, logspace, geomspace | 
| 坐标网格 | meshgrid, mgrid, ogrid, indices | 
单值数组
empty生成指定维度的空数组。
ones , zeros 和 full 生成所有元素都相同的数组,顾名思义ones和zeros分别是全1和全0的数组,而full则可以指定其 fill_value ,例如
np.ones(3) #生成全1的3x1数组 np.zeros([2,3]) #生成全0的2x3数组 x = np.full([2,4], 5) #生成元素均为5的2x4数组
以 _like 为后缀的函数,表示生成一个和输入数组维度相同的数组,以ones为例, np.ones_like(x) 等价于 np.ones(x.shape) 。
>>> y = np.full_like(x, 6)
特殊矩阵
eye 和 identity 都是生成对角为1,其他元素为0的矩阵,区别在于, identity 只能生成单位矩阵,即方阵;而 eye 则可以生成行列数不同的矩阵。 diagflat 和 diag 用于生成对角矩阵,下面用图像的方式,来表现这四种对角矩阵

这些矩阵的生成方式就是每个子图标题中所显示的,完整的绘图代码附在文末。
diag 在 diagflat 基础上,还可以提取对角元素,例如
>>> np.diag(np.ones([3,3])) #提取对角元素 array([1., 1., 1.])
tri(M,N,k)用于生成M行N列的三角阵,其元素为0或者1,k用于调节0和1的分界线相对于对角线的位置,下图中,红色表示1,蓝色表示0.

tril, triu 可用于提取出矩阵的左下和右上的三角阵,其输入参数除了待提取矩阵之外,另一个参数与 tri 中的 k 相同,把x设为
x = np.arange(20).reshape(4, 5)
则 tril 和 triu 作用在x上的效果分别如下,二者分别把右上角和左下角的值变成了0。

范德蒙德矩阵
范德蒙德矩阵可表示为

np.vander 可通过给定的 α i \alpha_i αi生成范德蒙德矩阵,例如
x = np.array([1, 2, 3, 5])y = np.vander(x, increasing=True)
其结果为

数值范围
arange是Numpy中使用频率超高的一个数组生成器,其输入参数可以为一个、两个或者三个,调用结果如下图,其中横轴表示生成数组的下标,纵轴表示值

与 arange 作用相似的函数是 linspace ,其输入参数为 np.linspace(a,b,num) ,表示在 a , b a,b a,b之间等间隔生成 num 个数;如果指明 endpoint=False ,则不包含 b b b点。
np.linspace(1,2,5) # [1. , 1.25, 1.5 , 1.75, 2. ]
linspace 和 arange 非常相似,区别如下
linspace(a,b,N)在 [ a , b ] [a,b] [a,b]中间生成N个值arange(a,b,delta)在 [ a , b ) [a,b) [a,b)之间,以 d e l t a delta delta为间隔生成值
logspace 与 linspace 逻辑相似,都是在某个区间内等间隔生成数组,但 logspace 是对数意义上的等间隔,其等价于 10**np.linspace 。
print(np.logspace(1,2,5)) # [ 10. 17.7827941 31.6227766 56.23413252 100. ] print(10**np.linspace(1,2,5)) # [ 10. 17.7827941 31.6227766 56.23413252 100. ]
logspace 中的 base 参数,可以指定对数的底,例如
>>> print(np.logspace(1,2,5,base=2)) [2. 2.37841423 2.82842712 3.36358566 4.]
geomspace 同样是等间隔生成对数,但和 logspace 的区别是,同样在 a,b 区间内生成对数, logspace 生成范围是 [ 1 0 a , 1 0 b ] [10^a,10^b] [10a,10b], geomspace 的范围则是 [ a , b ] [a,b] [a,b]。
>>> print(np.geomspace(1,2,5)) [1. 1.18920712 1.41421356 1.68179283 2.]
这种区别可能过于微妙,画个图可能理解起来更加容易
对比如下

最后,总结一下这三个 space 函数的区别
linspace(a,b,N)在 [ a , b ] [a,b] [a,b]中间生成N个值logspace(a,b,N,base=c)在 [ c a , c b ] [c^a, c^b] [ca,cb]之间等指数间隔生成N个值geomspace(a,b,N,base=c)在 [ a , b ] [a,b] [a,b]之间,等指数间隔生成N个值
坐标网格
在三维图的绘制过程中,一般需要 x , y , z x,y,z x,y,z之间的对应关系,但对于图像而言,其 x , y x,y x,y轴坐标是体现在像素栅格中的,从而图像矩阵中的像素强度,其实表示的是 z z z轴的坐标,这种情况下如果想绘制三维散点图,就需要生成图像像素对应的坐标网格。
在 Numpy 中,最常用的坐标网格生成函数,就是 meshgrid ,其用法可参考下面的示例
x = [0,1,2,3,4] y = [0,1,2,3] xv, yv = np.meshgrid(x, y)
其中

直观地说,就是对输入的 x , y x,y x,y变量,分别向 y y y轴和 x x x轴方向进行了扩张。
mgrid 比 meshgrid 更加简单,可以直接通过魔法函数生成坐标网格。
>>> xv, yv = np.mgrid[0:2, 2:5] >>> print(xv) [[0 0 0] [1 1 1]] >>> print(yv) [[2 3 4] [2 3 4]]
当然,这个维度和步长可以任意选择,
>>> np.mgrid[1:5] array([1, 2, 3, 4]) >>> np.mgrid[1:10:5] array([1, 6]) >>> np.mgrid[1.1:10] array([1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 8.1, 9.1])
如果翻阅源码,会发现 mgrid 是 MGridClass() 的一个实例, MGridClass 则是 nd_grid 的一个子类,在 nd_grid 中,实现了 __getitem__ 这个魔法函数,从而达成了 [] 的索引方法。
ogrid 的用法与 mgrid 相同,二者都是 nd_grid 的子类,但生成的数组不同,直接看案例
>>>x,y = ogrid[0:5,0:5]
其中, x = [ 0 , 1 , 2 , 3 , 4 ] T ,y=[0,1,2,3,4]。
如果想干脆一点,只是生成从0开始的等间隔的坐标网格,那么这里最推荐的是 indices ,这个函数只需输入维度,就可以完成网格的创建。
接下来打开一张图片演示一下

import numpy as np
import matplotlib.pyplot as plt
img = plt.imread('test.jpg')
ax = plt.subplot(projection='3d')
gray = img[:,:,1]
yMat, xMat = np.indices(gray.shape)
ax.plot_surface(xMat, yMat, gray)
ax.axis('off')
plt.show()效果为

绘图代码
对角矩阵
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure(figsize=(9,3))
ax = fig.add_subplot(141)
ax.imshow(np.identity(5))
plt.title("np.identity(5)")
ax = fig.add_subplot(142)
ax.imshow(np.eye(5,3))
plt.title("np.eye(5,3)")
ax = fig.add_subplot(143)
ax.imshow(np.diagflat([1,2,3]))
plt.title("np.diagflat([1,2,3])")
ax = fig.add_subplot(144)
ax.imshow(np.diag([1,2,3]))
plt.title("np.diag([1,2,3])")
plt.colorbar()
plt.tight_layout()
plt.show()tri矩阵
fig = plt.figure(figsize=(9,4))
cmap = plt.get_cmap('jet')
for i in range(6):
    ax = fig.add_subplot(2,3,i+1)
    ax.invert_yaxis()
    ax.pcolor(np.tri(4,6,i), edgecolors='k', cmap=cmap)
    plt.title(f"np.tri(4,6,{i})")
plt.tight_layout()
plt.show()tril和triu
x = np.arange(20).reshape(4, 5) fig = plt.figure(figsize=(9,4)) ax = fig.add_subplot(121) ax.invert_yaxis() ax.imshow(np.tril(x,-1), cmap=cmap) plt.title(f"np.tril(x,-1)") ax = fig.add_subplot(122) ax.invert_yaxis() ax.imshow(np.triu(x,-1), cmap=cmap) plt.title(f"np.triu(x,-1)") plt.tight_layout() plt.show()
arange
fig = plt.figure(figsize=(9,3))
ax = fig.add_subplot(131)
plt.stem(np.arange(10))
plt.title("np.arange(10)")
ax = fig.add_subplot(132)
plt.stem(np.arange(3,10))
plt.title("np.arange(3,10)")
ax = fig.add_subplot(133)
plt.stem(np.arange(3,10,2))
plt.title("np.arange(3,10,2)")
plt.tight_layout()
plt.show()logspace和geospace
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(1,2,20)
y = {"logspace" : np.logspace(1,2,20), 
"geomspace" : np.geomspace(1,2,20)}
fig = plt.figure()
for i,key in zip([1,2],y.keys()):
    ax = fig.add_subplot(1,2,i)
    ax.plot(x,y[key],marker="*")
    ax.set_title(key)
plt.show()以上就是python使用numpy生成18种特殊数组的详细内容,更多关于python numpy生成数组的资料请关注脚本之家其它相关文章!
