前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >原生的 Python 和带广播的 Numpy

原生的 Python 和带广播的 Numpy

作者头像
double
发布2019-05-07 18:42:08
8850
发布2019-05-07 18:42:08
举报
文章被收录于专栏:算法channel算法channel

利用 Python 原生的功能,创建一个二维的 list,变量名称为 x ,其 shape 为 (3,1)

代码语言:javascript
复制
In [3]: x = [[3],[1],[4]]In [15]: xOut[15]: [[3], [1], [4]]

现在我想把它扩展为 (3,4)的二维 list, 并且每列都为 [3, 1, 4],如下所示:

代码语言:javascript
复制
Out[20]: [[3, 3, 3, 3], [1, 1, 1, 1], [4, 4, 4, 4]]

利用 list 的 [] * 4 便可扩展成上面的二维形式

代码语言:javascript
复制
In [20]: list(map(lambda i: i*4, x))

同理,创建一个二维 list , 变量名称为 y, 其 shape 为 (1, 4)

代码语言:javascript
复制
In [6]: y = [[5,1,3,2]] In [16]: yOut[16]: [[5, 1, 3, 2]]

然后,扩展为 (3,4) 的二维 list

代码语言:javascript
复制
In [22]: y*3                                                 Out[22]: [[5, 1, 3, 2], [5, 1, 3, 2], [5, 1, 3, 2]]

好了,现在二维 list 变量 x, y, shape 变为一样了。

接下来,分别比较它们各自的对应元素,如果 x[i][j] < y[i][j] ,则选择 x[i][j] ,并加 1, 否则,选择 y[i][j], 并减 1,并返回一个对应维度的二维 list.

实现以上功能,还得至少需要以下 3 行代码,返回结果 result

代码语言:javascript
复制
In [29]: result = []     ...: for i, j in zip(x,y):     ...:   result.append([ii+1 if ii<jj else jj-1 for ii, jj in zip(i,j)])     ...:                                                                        
In [30]: resultOut[30]: [[4, 0, 2, 1], [2, 0, 2, 2], [5, 0, 2, 1]]

综上,大概一共需要 7,8 行代码得到想要的结果

如果使用 Numpy 中的函数,可能只需要 1 行,

代码语言:javascript
复制
In [33]: np.where(np.array(x)<np.array(y),np.array(x)+1,np.array(y)-1)         Out[33]: array([[4, 0, 2, 1],       [2, 0, 2, 2],       [5, 0, 2, 1]])

np.where 第一个参数,意义为判断条件,官方的解释如下,x , y 和 condition 需要是可广播的,并最终传播为某种 shape.

代码语言:javascript
复制
x, y : array_like        Values from which to choose. `x`, `y` and `condition` need to be        broadcastable to some shape.

之所以,从文章开头到后面大部分篇幅,都在使用 Python 原生的功能实现与 Numpy 同样的效果,就是为了更好的说明 Numpy 的传播机制。

通过对比,或许更容易明白 Numpy 的传播机制。希望效果真如此吧!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员郭震zhenguo 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档