Numpy中几个相对“高级”的API学习记录
1. meshgrid()
该方法大多时候用于在二维或者三维空间中,生成网格采样点的坐标,例如一张宽高为H=3、W=4的图片
如果想要以每一个像素点坐标作为参数进行计算,最简单的办法是进行遍历:
for x in range(H): for y in range(W): # some method # foo(x, y)
但是这样做python代码的运行速度很差,此时可以利用numpy的meshgrid方法
x = np.arange(0, H) y = np.arange(0, W) X, Y = np.meshgrid(x, y, indexing='ij') >>> X array([[0, 0, 0, 0], [1, 1, 1, 1], [2, 2, 2, 2]]) >>> Y array([[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]])
meshgrid方法创建二维网格的方法特别简单,返回两个二维矩阵X和Y;(indexing='ij'表示矩阵形式,还有一个选项是'xy',是笛卡尔坐标轴形式)
这个时候得到的X,Y是我们进行批量操作的新变量,X代表所有像素点的行坐标,Y代表所有像素点的列坐标,并且X和Y元素之间始终存在对应关系。
此时,不需要循环,直接将X, Y传入目标方法即可,当然了,目标方法foo中相关操作也要用numpy实现。
# for x in range(H): # for y in range(W): # some method # foo(x, y) foo(X, Y)
2. concatenate()
该方法用于多维数组的拼接,例如有这样一个需求:A,B,C分别是不同维数的多维数组,现在需要将A,B,C中所有元素放在一起进行排序。
A = np.random.random((3,4)) B = np.random.random((3,4,3)) C = np.random.random((2,3))
A,B,C 三个数组应该把所有元素合并到一起再排序。首先把A,B,C变成一维,然后利用concatenate把它们合并到一起。
A1 = A.flatten()
B1=B.flatten()
C1=C.flatten()
D = np.concatenate([A1, B1), C1]) sorted(D)
以上只是一个小的应用,concatenate方法还可以指定axis进行合并,axis=0表示行数增加,axis=1表示列数增加,axis=2表示第三维度数增加
如果传入的参数数组都是一维的,例如上述代码,则axis只有0值可用,行数增加:
>>> A1.shape (12,) >>> B1.shape (36,) >>> C1.shape (6,) >>> D.shape (54,)
如果传入的参数数组是二维的,axis=0时,两个参数数组的列数需要一致;axis=1时,两个参数数组的行数需要一致。
行数保持一致,合并列:
>>> B.shape (3, 4, 3) B2 = B.reshape((3, 12)) >>> B2.shape (3, 12) >>> A.shape (3, 4) E = np.concatenate([A, B2], axis=1) >>> E.shape (3, 16)
列数保持一致,合并行:
>>> B.shape (3, 4, 3) B3 = B.transpose((0, 2, 1)) B3 = B3.reshape((9, 4)) >>> B3.shape (9, 4) F = np.concatenate([A, B3], axis=0) >>> F.shape (12, 4)