python中numpy包中的tile函数的使用

在使用knn算法时候我们需要计算要分类的点到其他点的距离,这个使用我们可以将该分类点进行复制多份,然后分别与其他点进行计算即可,如图所示我们需要将要分类的点复制四份,然后分别与其他四个训练数据集的点做距离计算,然后对距离进行排序(使用python中的argsort进行排序)

下面我们开看下tile的使用方法,我们可以通过help函数进行了解

help(numpy.tile)
Help on function tile in module numpy.lib.shape_base:
tile(A, reps)
    Construct an array by repeating A the number of times given by reps.
    
    If `reps` has length ``d``, the result will have dimension of

举例说明

    >>> a = np.array([0, 1, 2])
    >>> np.tile(a, 2)
    array([0, 1, 2, 0, 1, 2])  #直接将a复制两份
    >>> np.tile(a, (2, 2))
    array([[0, 1, 2, 0, 1, 2],
           [0, 1, 2, 0, 1, 2]])
    >>> np.tile(a, (2, 1, 2))
    array([[[0, 1, 2, 0, 1, 2]],
           [[0, 1, 2, 0, 1, 2]]])
    
    >>> b = np.array([[1, 2], [3, 4]])
    >>> np.tile(b, 2)
    array([[1, 2, 1, 2],
           [3, 4, 3, 4]])
    >>> np.tile(b, (2, 1))
    array([[1, 2],
           [3, 4],
           [1, 2],
           [3, 4]])

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。如下图所示:

when d>=len

当d>=len时,将reps长度补足为d,即在reps前面加上d-len个1。这里的意思是,假设A为k维数组,每一维都有一定长度,构成的向量为D。而长度为len的reps有len个数,进行tile函数运算时补足d位,前面加d-len个1,经过tile运算,生成新的A,A的各维维度为:

公式里面的*代表的就是复制的意思如l_{d}*n_{len}表示l_{d}被复制n_{len}

其中相乘的意思为,将原来A中每一维度的元素进行copy,生成的A中此元素出现次数为新的reps对应维度的数目。操作从低维度向高维进行。

举例说明:

首先给几个示例:
>>> tile(1.3,2)
array([ 1.3,  1.3])
>>> tile((1,2,3),2)  
array([1, 2, 3, 1, 2, 3])
>>> a=[[1,2,3],[4,5,5]]
>>> tile(a,2)    #== tile(a,[1,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]]结果如上所示。

 其他类型

①当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]

简单例子

>>> 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]]]])
#下面我们看看依次是怎么变化的
>>> tile([1,2,3],2)
array([1, 2, 3, 1, 2, 3])
>>> tile([1,2,3],[2,2])
array([[1, 2, 3, 1, 2, 3],
       [1, 2, 3, 1, 2, 3]])
>>> tile([1,2,3],[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]]])

>>> 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]]]])
#这样看的话,可能变化规律就很明显了

希望对你有所帮助!

猜你喜欢

转载自blog.csdn.net/huang_shao1/article/details/82217534
今日推荐