ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Numpy中“高级”API学习记录

2022-04-12 23:31:26  阅读:211  来源: 互联网

标签:concatenate random 高级 shape API B3 np Numpy axis


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)

 

标签:concatenate,random,高级,shape,API,B3,np,Numpy,axis
来源: https://www.cnblogs.com/heartxkl/p/16138221.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有