入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

numpy中多维数组的轴(axis)

创建时间:2016-01-14 投稿人: 浏览次数:12596

多维数组的轴(axis=)是和该数组的size(或者shape)的元素是相对应的;

>>> np.random.seed(123)
>>> X = np.random.randint(0, 5, [3, 2, 2])
>>> print(X)

[[[5 2]
  [4 2]]

 [[1 3]
  [2 3]]

 [[1 1]
  [0 1]]]

>>> X.sum(axis=0)
array([[7, 6],
       [6, 6]])

>>> X.sum(axis=1)
array([[9, 4],
       [3, 6],
       [1, 2]])

>>> X.sum(axis=2)
array([[7, 6],
       [4, 5],
       [2, 1]])

如果将三维数组的每一个二维看做一个平面(plane,X[0, :, :], X[1, :, :], X[2, :, :]),三维数组即是这些二维平面层叠(stacked)出来的结果。则(axis=0)表示全部平面上的对应位置,(axis=1),每一个平面的每一列,(axis=2),每一个平面的每一行。

考察多维数组的dot运算

numpy.dot(a, b, out=None)
  • For 2-D arrays it is equivalent to matrix multiplication,

    两个二维数组的dot运算遵循矩阵乘法(其实一个二维一个一维也是矩阵乘法(Ax))

  • and for 1-D arrays to inner product of vectors (without complex conjugation).

    两个一维数组的dot运算执行的是内积运算(对应位相乘相加)

  • For N dimensions it is a sum product over the last axis of a and the second-to-last of b。

    dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m])
    a的最后一轴与b的倒数第二轴,(而 np.tensordot 可灵活地指定相互作用的两个矩阵的任意轴
    这不正是著名的 Am×n⋅Bn×pA 的每一行乘以 B的每一列;

>>> X.dot([1, 1])
array([[7, 6],
       [4, 5],
       [2, 1]])
                           # X的最后一轴是每一个二维的行方向

此时如果我们想通过矩阵与向量(一维)内积的方式实现(np.sum(X, axis=0)的结果)需使用np.tensordots(X, [1, 1, 1], axes=([0], [0])),具体的用法见 np.tensordots文档。

>>> np.tensordots(X, [1, 1, 1], axes=([0], [0]))

array([[7, 6],
       [6, 6]])

我们再来看看如何实现多维数组求平均的动作(每一个二维平面对应位的平均):

>>> X = np.random.randint(0, 5, [3, 2, 2])
>>> X
array([[[3, 4],
        [2, 2]],

       [[3, 4],
        [2, 3]],

       [[2, 1],
        [1, 3]]])

>>> np.tensordot(X, [1/3, 1/3, 1/3], axes=([0], [0]))
array([[ 2.66666667,  3.        ],
       [ 1.66666667,  2.66666667]])
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。