zoukankan      html  css  js  c++  java
  • Numpy的tile函数

    1.函数的定义与说明

    tile函数是模板numpy.lib.shape_base中的函数。
    函数的形式是tile(A,reps)
    函数参数说明中提到A和reps都是array_like的,什么是array_like的parameter呢?在网上查了一下,始终搞不明白,便把熟悉的python数据类型都试了一下,得出以下结论。
    A的类型众多,几乎所有类型都可以:array, list, tuple, dict, matrix以及基本数据类型int, string, float以及bool类型。
    reps的类型也很多,可以是tuple,list, dict, array, int,bool.但不可以是float, string, matrix类型。
    假定A的维度为d,reps的长度为len
    当d>=len时,将reps长度补足为d,即在reps前面加上d-len个1。
    这里的意思是,假设A为k维数组,每一维都有一定长度,构成的向量为D。
    Numpy的tile函数
    而长度为len的reps有len个数,进行tile函数运算时补足d位,前面加d-len个1,如下图所示:
    Numpy的tile函数
    经过tile运算,生成新的A,A的各维维度为:Numpy的tile函数
    其中相乘的意思为,将原来A中每一维度的元素进行copy,生成的A中此元素出现次数为新的reps对应维度的数目。操作从低维度向高维进行。
    当d
    2.函数操作示例
    首先给几个示例:
    >>> tile(1.3,2)
    array([ 1.3,  1.3])
    array([1, 2, 1, 2, 1, 2])
    >>> tile((1,2,3),2)
    array([1, 2, 3, 1, 2, 3])
    >>> a=[[1,2,3],[4,5,5]]
    >>> tile(a,2)
    array([[1, 2, 3, 1, 2, 3],
           [4, 5, 5, 4, 5, 5]])
    >>> tile([1,2,3],[2,2,2,2])
    array([[[[1, 2, 3, 1, 2, 3],
             [1, 2, 3, 1, 2, 3]],
     
            [[1, 2, 3, 1, 2, 3],
             [1, 2, 3, 1, 2, 3]]],
     
     
           [[[1, 2, 3, 1, 2, 3],
             [1, 2, 3, 1, 2, 3]],
     
            [[1, 2, 3, 1, 2, 3],
             [1, 2, 3, 1, 2, 3]]]])
    拿其中一个例子进行说明:
    >>> a=[[1,2],[2,3]]
    >>> tile(a,2)
    array([[1, 2, 1, 2],
           [2, 3, 2, 3]])
    这里a的维度为2,reps长度为1(仅仅是1个int类型数据)
    则将reps长度补足为2,结果为reps = [1,2](这里也可以写成reps=(1,2),都无妨的)
    进行copy操作,从低维进行.数组a为a[2][2]
    一维copy操作:copy两次。a[0]变为[1,2,1,2],a[1]变为[2,3,2,3]
    二维copy操作,copy1次。a变为[[1,2,1,2],[2,3,2,3]]
    a数组为a[2][4]
    如此则不难理解下面的结果:
    >>> tile(a,[1,2])
    array([[1, 2, 1, 2],
           [2, 3, 2, 3]])
    >>> tile(a,[2,2])
    array([[1, 2, 1, 2],
           [2, 3, 2, 3],
           [1, 2, 1, 2],
           [2, 3, 2, 3]])
    tile(a,[2,2])中是将上述第二步的对a的第二维的copy次数变成了两次,a[0]copy两次,a[1]copy两次:[a[0],a[0],a[1],a[1]]结果如上所示。
    3.函数其他注意事项
    ①当reps为bool类型或者是bool list类型的时候,与int类型相对应,即True对应为1,False对应为0.如:
    >>> tile([1,2],[True,False])
    array([], shape=(1, 0), dtype=int32)
    >>> tile([1,2],[True,True])
    array([[1, 2]])
    >>> tile([1,2],[True,True,True])
    array([[[1, 2]]])
    >>> tile([1,2],True)
    array([1, 2])
    ②当reps为dict类型时,实则取的是key值列表,且key值列表为升序排列如下所示:
    >>> tile([1,2,3],{1:2,3:4})
    array([[1, 2, 3, 1, 2, 3, 1, 2, 3]])
    >>> tile([1,2,3],{3:4,1:2})
    array([[1, 2, 3, 1, 2, 3, 1, 2, 3]])
    >>> a={1:2,3:4}
    >>> tile([1,2,3],a.keys())
    array([[1, 2, 3, 1, 2, 3, 1, 2, 3]])
    ③当A为int,string,float,bool,dict等类型的时候,操作大体相似,都是讲A视为一个整体,生成一个与reps的长度相同维度的数组。如下所示:
    >>> tile({1:2,3:4,5:6},3)
    array([{1: 2, 3: 4, 5: 6}, {1: 2, 3: 4, 5: 6}, {1: 2, 3: 4, 5: 6}], dtype=object)
    >>> tile({1:2,3:4,5:6},[2,2])
    array([[{1: 2, 3: 4, 5: 6}, {1: 2, 3: 4, 5: 6}],
           [{1: 2, 3: 4, 5: 6}, {1: 2, 3: 4, 5: 6}]], dtype=object)
    >>> tile('abc',3)
    array(['abc', 'abc', 'abc'], 
          dtype='|S3')
    >>> tile('abc',[3,3])
    array([['abc', 'abc', 'abc'],
           ['abc', 'abc', 'abc'],
           ['abc', 'abc', 'abc']], 
          dtype='|S3')
    >>> tile(2,3)
    array([2, 2, 2])
    >>> tile(2,[3,3])
    array([[2, 2, 2],
           [2, 2, 2],
           [2, 2, 2]])
    不过有所不同的是,当A为string类型以及dict类型的时候,array数组最后多了一个信息,即dtype,原因为何,即便看了一些源码,也不晓得是怎么回事,好像由array到ndarray,一大堆C的东西,搞不明白,索性作罢。另外,当对list类型进行mat操作然后作为参数A传入tile时也可以,不过结果类型不是array类型,而是matrix类型了,原因几何,我也无法解答。
    看了tile的源码以后以上内容差不多都可以理解。例如之所以reps的类型有限制,在于代码一开始对reps进行了以下操作:
    tuple(reps),无法进行该操作的reps参数就会报错。而且dict类型的reps进行tuple化以后,key值以升序出现,这也是注意事项中2的原因,而list和tuple类型的数值顺序不变。
    大概就是以上了。我对numpy这里了解的不是很多,还希望向内行多多讨教呢,所以有问题不妨留言~
  • 相关阅读:
    java实现第五届蓝桥杯六角幻方
    java实现第五届蓝桥杯六角幻方
    java实现第五届蓝桥杯六角幻方
    java实现第五届蓝桥杯海盗分金币
    java实现第五届蓝桥杯海盗分金币
    java实现第五届蓝桥杯海盗分金币
    java实现第五届蓝桥杯海盗分金币
    java实现第五届蓝桥杯海盗分金币
    jQuery异步上传文件
    关于心跳ajax请求pending状态(被挂起),stalled时间过长的问题。涉及tcp连接异常。
  • 原文地址:https://www.cnblogs.com/Zidon/p/5079107.html
Copyright © 2011-2022 走看看