1. output
  2.  

    array([[ 0.24747071, -0.43886742],
  3.  

    [-0.03916734, -0.70580089],
  4.  

    [ 0.00462337, -0.51431584],
  5.  

    ...,
  6.  

    [ 0.15071507, -0.57029653],
  7.  

    [ 0.06246116, -0.33766761],
  8.  

    [ 0.08218585, -0.59906501]], dtype=float32)
  9.  
     
  10.  

    ipdb> np.shape(output)
  11.  

    (64, 2)
  12.  
     
  13.  

    ipdb> np.max(output, axis=1)[:,np.newaxis]
  14.  

    array([[ 0.24747071],
  15.  

    [-0.03916734],
  16.  

    [ 0.00462337],
  17.  

    ...,
  18.  

    [ 0.15071507],
  19.  

    [ 0.06246116],
  20.  

    [ 0.08218585]], dtype=float32)
  21.  
     
  22.  

    ipdb> np.tile(np.max(output, axis=1)[:,np.newaxis], [1,2]))
  23.  

    *** SyntaxError: invalid syntax (<stdin>, line 1)
  24.  
     
  25.  

    ipdb> np.tile(np.max(output, axis=1)[:,np.newaxis], [1,2])
  26.  

    array([[ 0.24747071, 0.24747071],
  27.  

    [-0.03916734, -0.03916734],
  28.  

    [ 0.00462337, 0.00462337],
  29.  

    ...,
  30.  

    [ 0.15071507, 0.15071507],
  31.  

    [ 0.06246116, 0.06246116],
  32.  

    [ 0.08218585, 0.08218585]], dtype=float32)
  33.  
     
  34.  

    ipdb> output
  35.  

    array([[ 0.24747071, -0.43886742],
  36.  

    [-0.03916734, -0.70580089],
  37.  

    [ 0.00462337, -0.51431584],
  38.  

    ...,
  39.  

    [ 0.15071507, -0.57029653],
  40.  

    [ 0.06246116, -0.33766761],
  41.  

    [ 0.08218585, -0.59906501]], dtype=float32)
  42.  
     
  43.  

    ipdb> np.max(output, axis=1)
  44.  

    array([ 0.24747071, -0.03916734, 0.00462337, ..., 0.15071507,
  45.  

    0.06246116, 0.08218585], dtype=float32)
  46.  

    ipdb> np.exp(output - np.tile(np.max(output, axis=1)[:,np.newaxis], [1,2]))
  47.  

    array([[ 1.        ,  0.50341612],
  48.  

           [ 1.        ,  0.51343411],
  49.  

           [ 1.        ,  0.59515154],
  50.  

           ...,
  51.  

           [ 1.        ,  0.48626012],
  52.  

           [ 1.        ,  0.67023373],
  53.  

           [ 1.        ,  0.50598365]], dtype=float32)

 

1- np.newaxis

 

np.newaxis的功能是插入新维度,看下面的例子:


a=np.array([1,2,3,4,5])

print a.shape


print a

输出结果

(5,)

[1 2 3 4 5]

可以看出a是一个一维数组,


x_data=np.linspace(-1,1,300)[:,np.newaxis]

a=np.array([1,2,3,4,5])

b=a[np.newaxis,:]

print a.shape,b.shape

print a


print b

输出结果:

(5,) (1, 5)

[1 2 3 4 5]

[[1 2 3 4 5]]

 

x_data=np.linspace(-1,1,300)[:,np.newaxis]

a=np.array([1,2,3,4,5])

b=a[:,np.newaxis]

print a.shape,b.shape

print a

print b

输出结果

(5,) (5, 1)

[1 2 3 4 5]

[[1]

 [2]

 [3]

 [4]

 [5]]


可以看出np.newaxis分别是在行或列上增加维度,原来是(6,)的数组,在行上增加维度变成(1,6)的二维数组,在列上增加维度变为(6,1)的二维数组


2. np.tile

函数原型:numpy.tile(A,reps) #简单理解是此函数将A进行重复输出


 其中A和reps都是array_like的参数,A可以是:array,list,tuple,dict,matrix以及基本数据类型int,string,float以及bool类型,reps的类型可以是tuple,list,dict,array,int,bool,但不可以是float,string,matrix类型。


计较常用的形式有两种,是将A简单进行一维重复输出,和将A进行二维重复后输出。

一维重复:


  1.  

    import numpy as np
  2.  

    a = [[1,2,3],[4,5,5]]
  3.  

    b = np.tile(a,3)
  4.  

    print(b)
  5.  
     
  6.  

    #输出为
  7.  

    #[[1 2 3 1 2 3 1 2 3]
  8.  

    # [4 5 5 4 5 5 4 5 5]]


二维重复:#上面的一维重复相当于 b = np.tile(a,[1,3])


  1.  

    import numpy as np
  2.  

    a = [[1,2,3],[4,5,5]]
  3.  

    b = np.tile(a,[2,3])
  4.  

    print(b)
  5.  
     
  6.  

    #输出为:
  7.  

    #[[1 2 3 1 2 3 1 2 3]
  8.  

    # [4 5 5 4 5 5 4 5 5]
  9.  

    # [1 2 3 1 2 3 1 2 3]
  10.  

    # [4 5 5 4 5 5 4 5 5]]



2.1 np.tile

numpy.tile()是个什么函数呢,说白了,就是把数组沿各个方向复制

比如 a = np.array([0,1,2]),    np.tile(a,(2,1))就是把a先沿x轴(就这样称呼吧)复制1倍,即没有复制,仍然是 [0,1,2]。 再把结果沿y方向复制2倍,即最终得到

 array([[0,1,2],

             [0,1,2]])

同理:



>>> b = np.array([[1, 2], [3, 4]])
>>> np.tile(b, 2) #沿X轴复制2倍
array([[1, 2, 1, 2],
[3, 4, 3, 4]])
>>> np.tile(b, (2, 1))#沿X轴复制1倍(相当于没有复制),再沿Y轴复制2倍
array([[1, 2],
[3, 4],
[1, 2],
[3, 4]])


numpy.tile()具体细节,如下:


numpy.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 max(d, A.ndim).

If A.ndim < d, A is promoted to be d-dimensional by prepending new axes. So a shape (3,) array is promoted to (1, 3) for 2-D replication, or shape (1, 1, 3) for 3-D replication. If this is not the desired behavior, promote A to d-dimensions manually before calling this function.

If A.ndim > d, reps is promoted to A.ndim by pre-pending 1’s to it. Thus for an A of shape (2, 3, 4, 5), a repsof (2, 2) is treated as  (1, 1, 2, 2).

Note : Although tile may be used for broadcasting, it is strongly recommended to use numpy’s broadcasting operations and functions.

Parameters:


A : array_like

The input array.

reps : array_like

The number of repetitions of A along each axis.


Returns:


c : ndarray

The tiled output array.



See also

​repeat​​Repeat elements of an array. ​


​broadcast_to​​ Broadcast an array to a new shape

Examples



>>>

>>> a = np.array([0, 1, 2])
>>> np.tile(a, 2)
array([0, 1, 2, 0, 1, 2])
>>> 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]])



>>>

>>> c = np.array([1,2,3,4])
>>> np.tile(c,(4,1))
array([[1, 2, 3, 4],
[1, 2, 3, 4],
[1, 2, 3, 4],
[1, 2, 3, 4]])



作者:柒月