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)

 

posted @ 2022-04-12 23:25  heartxkl  阅读(34)  评论(0编辑  收藏  举报