原生的 Python 和带广播的 Numpy

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


 
 
  1. In [3]: x = [[3],[1],[4]]

  2. In [15]: x

  3. Out[15]: [[3], [1], [4]]


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


 
 
  1. Out[20]: [[3, 3, 3, 3], [1, 1, 1, 1], [4, 4, 4, 4]]


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


 
 

In [20]: list(map(lambda i: i*4, x))



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


 
 
  1. In [6]: y = [[5,1,3,2]]

  2. In [16]: y

  3. Out[16]: [[5, 1, 3, 2]]


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

 
 
  1. In [22]: y*3

  2. 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


 
 
  1. In [29]: result = []

  2. ...: for i, j in zip(x,y):

  3. ...: result.append([ii+1 if ii<jj else jj-1 for ii, jj in zip(i,j)])

  4. ...:


  5. In [30]: result

  6. Out[30]: [[4, 0, 2, 1], [2, 0, 2, 2], [5, 0, 2, 1]]


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


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


 
 
  1. In [33]: np.where(np.array(x)<np.array(y),np.array(x)+1,np.array(y)-1)

  2. Out[33]:

  3. array([[4, 0, 2, 1],

  4. [2, 0, 2, 2],

  5. [5, 0, 2, 1]])


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


 
 
  1. x, y : array_like

  2. Values from which to choose. `x`, `y` and `condition` need to be

  3. broadcastable to some shape.


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


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




我正在系统性地编写一门小课,里面涵盖了入门数据分析的几乎所有核心知识,可以说是干货十足,2 人组团买只需 9 块多,详细参考:关于数据分析的学习路线,我准备写一篇 2 万+的 chat,购买后,你还可以通过「分享卡片」,一位朋友通过你分享的卡片,购买后,你可以赚取 2.5 元的外块。如果搞定 5 个,一顿早餐就出来了smiley_0.png


640?wx_fmt=png

参与入口:长按下图即可转到链接。


640?wx_fmt=png

长按二维码参与


最后,小编感谢你的捧场,如果转发此文或告诉身边更多的朋友地话,将不胜感激。



640?wx_fmt=jpeg

Python与机器学习算法频道

长按订阅,干货满满

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值