np.tile、np.meshgrid、np.where学习总结

最近看代码的时候又碰到了几个关于numpy的用法,在这里总结记录一下,尽可能简洁,我的上一篇关于numpy的用法是:python numpy学习总结
PS:以下官网对应的都是numpy1.17版本的

一、numpy.tile()

首先,tile就是地砖,铺砖的意思,所以这个函数就是来像一片片铺砖贴瓦一样,对np.ndarray数组进行扩展广播。
numpy.tile(A, reps)

  • 输入数组A,reps指定沿A各个轴axis扩展的倍数,输出矩阵维数是max(d, A.ndim),其中d是reps的长度
  • dA.ndim的维数不相等的时候,就把那个维数小的一方前面插入维度,值为1,然后A沿第一个轴方向到最后的轴,对应reps里面的值进行对应axis的扩展,\color{#FF0000}{注意:这里不是单行单列的repeat,而是整体的扩展,可以对照numpy.repeat学习}
>>> a = np.array([0, 1, 2])
>>>> np.tile(a, 2)
array([0, 1, 2, 0, 1, 2])
>>> np.tile(a, (2, 3)) # 先把[0,1,2]升维成[[0,1,2]]
array([[0, 1, 2, 0, 1, 2, 0, 1, 2],
       [0, 1, 2, 0, 1, 2, 0, 1, 2]])
>>> np.tile(a, (2, 1, 3))
array([[[0, 1, 2, 0, 1, 2, 0, 1, 2]],
       [[0, 1, 2, 0, 1, 2, 0, 1, 2]]])
>>> b = np.array([[1, 2], [3, 4]])
>>> np.tile(b, (2, 1))
array([[1, 2],
       [3, 4],
       [1, 2],
       [3, 4]])
# 注意不是下面的这个结果,即上面红色字体提示:
# array([[1, 2],
#        [1, 2],
#        [3, 3],
#        [3, 4]])

官网强烈建议使用numpy.broadcast_to来进行广播

二、numpy.meshgrid()

numpy.meshgrid(*xi, **kwargs)

  • 输入是一些列1-D的array:x1, x2,…, xn。有几个最后的格点网格就是几维的,一般我们都是输入x和y,所以生成的是一张二维平面的网格
  • 有一些可选参数,例如indexing : {‘xy’, ‘ij’}坐标系In the 2-D case with inputs of length M and N, the outputs are of shape (N, M) for ‘xy’ indexing and (M, N) for ‘ij’ indexing,即返回的索引顺序会不一样,sparse : bool,copy : bool
>>> nx = 5
>>> ny = 3
>>> x = np.arange(nx) - (nx - 1) / 2
>>> x
array([-2., -1.,  0.,  1.,  2.])
>>> y = np.arange(ny) - (ny - 1) / 2
>>> y
array([-1.,  0.,  1.])
>>> xv, yv = np.meshgrid(x, y) #默认indexing='xy',所以输入(5,3),输出(3,5)
>>> xv
array([[-2., -1.,  0.,  1.,  2.],
       [-2., -1.,  0.,  1.,  2.],
       [-2., -1.,  0.,  1.,  2.]])
>>> yv
array([[-1., -1., -1., -1., -1.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 1.,  1.,  1.,  1.,  1.]])
>>> xv, yv = np.meshgrid(x, y, sparse=True)  # make sparse output arrays
>>> xv
array([[-2., -1.,  0.,  1.,  2.]])
>>> yv
array([[-1.],
       [ 0.],
       [ 1.]])
>>> xv, yv = np.meshgrid(x, y, indexing='ij')
>>> xv
array([[-2., -2., -2.],
       [-1., -1., -1.],
       [ 0.,  0.,  0.],
       [ 1.,  1.,  1.],
       [ 2.,  2.,  2.]])
>>> yv
array([[-1.,  0.,  1.],
       [-1.,  0.,  1.],
       [-1.,  0.,  1.],
       [-1.,  0.,  1.],
       [-1.,  0.,  1.]])

\color{#0000CD}{对于2-D的情况,记忆可以这样:现根据输入推出输出的shape,然后x一行一行填入,y一列一列按顺序添入就行}

三、numpy.where()

numpy.where(condition, x, y)

  • 输入condition,如果为真,就返回x;反之就返回y。condition, x, y要能广播到相同的某个shape
  • 但只有一个输入参数condition的时候,用法如numpy.nonzero
    这个函数的用法要分两种情况:1)就是condition, x, y三个参数都给出的时候;2)只给出condition一个参数的时候,下面分情况讨论:
    情况1我是这样记忆的:一维的基本挨个看满不满足条件,还是简单的;多维情况下一般condition, x, y是同样的shape的,那就element-wise的对照条件,也就返回对应位置上的值,条件为真就返回前面那个对应位置上的值,条件为假就返回后面那个对应位置上的值
# 情况 1)
# [xv if c else yv
#  for c, xv, yv in zip(condition, x, y)] 对于所有数组都是1-D的时候
>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.where(a < 5, a, 10*a)
array([ 0,  1,  2,  3,  4, 50, 60, 70, 80, 90])
>>> np.where([[True, False], [True, True]],
...          [[1, 2], [3, 4]],
...          [[9, 8], [7, 6]])
array([[1, 8],
       [3, 4]])

情况2当输入参数只有condition时,返回的是满足条件 (即非0) 元素的索引,以元组tuple的形式返回,因为返回的是索引,所以输入condition有N维时,返回的tuple长度也就是N,看例子

# 情况 2)
>>> np.where(a > 5)
(array([3, 4], dtype=int64),)
>>> a[np.where(a > 5)]
array([6, 7])
>>> a = np.arange(8).reshape(2,2,2)
>>> a
array([[[0, 1],
        [2, 3]],

       [[4, 5],
        [6, 7]]])
>>> np.where(a > 4)
(array([1, 1, 1], dtype=int64), 
 array([0, 1, 1], dtype=int64), 
 array([1, 0, 1], dtype=int64))
 # 返回的第一列[1,0,1]位置就是5,第二列[1,1,0]就是6的位置
 # 第三列[1,1,1]就是7的位置,所以就是满足条件(非零)的索引
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • 题型——输入一个链表,输出该链表中倒数第k个结点 此题我们可以先定义两个指针,p和q。让p和q都指向头结点。在定义...
    夏日柠檬哈阅读 88评论 0 0
  • https://www.cnblogs.com/qiernonstop/p/5032090.html Python...
    oolyou阅读 166评论 0 0
  • [pycharm的一些快捷键] 忙了好一阵终于忙完了,最近在重构代码,有许多地方要注释什么的,在多行注释时总是很麻...
    凌醉枫阅读 145评论 0 0
  • 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) 1 思路和方法 (1)...
    夏日柠檬哈阅读 104评论 0 0
  • 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半...
    夏日柠檬哈阅读 105评论 0 0