numpy中的dot、outer、multiply和*的用法

来源:互联网 发布:外国人对中国有知乎 编辑:程序博客网 时间:2024/06/03 21:52

numpy中的dot、outer、multiply和 * 的使用方法

1 np.dot()

​ numpy.dot(a, b, out=None):对于二维数组,它相当于矩阵的乘法;对于一维数组,则是向量的内积;而对于n维,它是a的最后一个轴向和b的倒数第二个轴向的乘积和。

代码如下:

  • 一维数组

    >>> np.dot(3, 4)12>>> np.dot([2, 3], [4, 4])20
  • 二维数组

    >>> a = [[1, 0], [0, 1]]>>> b = [[4, 1], [2, 2]]>>> np.dot(a, b)array([[4, 1],     [2, 2]])
  • n维数组

    >>> a = np.arange(6).reshape(1, 2, 3)>>> b = np.arange(6).reshape(2, 3, 1)>>> a array([[[0, 1, 2],      [3, 4, 5]]])>>> barray([[[0],      [1],      [2]],     [[3],      [4],      [5]]])>>> np.dot(a, b)array([[[[ 5],       [14]],      [[14],       [50]]]])

2 np.outer()

​ numpy.outer(a, b, out=None):计算两个向量的外积。已知两个输入向量为a = [a0, a1, ..., aM]b = [b0, b1, ..., bN],则输出为:

[[a0*b0  a0*b1 ... a0*bN ] [a1*b0    . [ ...          . [aM*b0            aM*bN ]]

注:输入a,b,如果不是一维数组,则先将其变成一维数组,即可得a(M,)和b(N,)这种形式,可得输出为(M,N)。

out[i, j] = a[i] * b[j]

代码如下:

  • 对于数字数组

    >>> a = np.array([[1, 2], [1, 1]])array([[1, 2],     [1, 1]])>>> b = np.array([[2, 3], [1, 3]])array([[2, 3],     [1, 3]])>>> np.outer(a, b)array([[2, 3, 1, 3],     [4, 6, 2, 6],     [2, 3, 1, 3],     [2, 3, 1, 3]])
  • 对一个字母例子

    >>> x = np.array(['a', 'b', 'c'], dtype=object)>>> np.outer(x, [1, 2, 3])array([[a, aa, aaa],     [b, bb, bbb],     [c, cc, ccc]], dtype=object)

3 np.multiply()

为对应元素的乘积。

代码如下:

>>> np.multiply(2.0, 4.0)8.0>>> x1 = np.array([[1, 2, 3], [4, 5, 6]])>>> x2 = np.array([[7, 8, 9], [4, 7, 1]])>>> np.multiply(x1, x2)array([[ 7, 16, 27],       [16, 35,  6]])

注:维度相等时才能使用,当数组或者矩阵的维度不相同时,会根据一定的广播规则将维数扩充到一致的形式,但是如果形式不能填充侧报错,如下

  • 可以自动填充

    >>> x1 = np.arange(9.0).reshape((3, 3))>>> x2 = np.arange(3.0)>>> np.multiply(x1, x2)array([[  0.,   1.,   4.],     [  0.,   4.,  10.],     [  0.,   7.,  16.]])
  • 对比情况

    >>> x1 = np.arange(9.0).reshape((3, 3))>>> x3 = np.arange(4.0)>>> np.multiply(x1, x3)<hr />ValueError                                Traceback (most recent call last)<ipython-input-50-abc06b5da097> in <module>()----> 1 np.multiply(x1, x3)ValueError: operands could not be broadcast together with shapes (3,3) (4,)

4 矩阵中的*

‘*’ 也为对于元素的乘积,当是两个数组相乘时和np.multiply用法相同,但是如果相乘的元素是矩阵时,则和np.dot用处相同,表示矩阵相乘。

  • 数组相乘:

    >>> x1 = np.arange(9.0).reshape((3, 3))>>> x2 = np.arange(3.0)>>> x1 * x2array([[  0.,   1.,   4.],   [  0.,   4.,  10.],   [  0.,   7.,  16.]])
  • 矩阵相乘

    >>> x1 = np.array([[1, 2], [3, 4]])>>> x2 = np.array([[7, 8], [4, 7]])>>> a = np.mat(x1)>>> b = np.mat(x2)>>> a*bmatrix([[15, 22],      [37, 52]])>>> np.dot(x1, x2)array([[15, 22],     [37, 52]])
原创粉丝点击