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

qlmx
qlmx
qlmx
54
文章
2
评论
2020年2月7日14:47:22 评论 1,376阅读5分50秒

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]]])
    >>> b
    array([[[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]])

注:维度相等时才能使用,当矩阵的维度不相同时,会根据一定的广播规则将维数扩充到一致的形式,具体见4中所述。

4 矩阵中的*

'*' 也为对于元素的乘积,它是对矩阵成立的,只能shape一样才能相乘。与其他shape的矩阵会报错。

代码如下:

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

特殊情况下,看起来shape不一样,实际是由于numpy的广播,自动填充

  • 可以自动填充
    >>> x1 = np.arange(9.0).reshape((3, 3))
    >>> x2 = np.arange(3.0)
    >>> x1 * x2
    array([[  0.,   1.,   4.],
         [  0.,   4.,  10.],
         [  0.,   7.,  16.]])
    
  • 对比情况

 >>> x1 = np.arange(9.0).reshape((3, 3))
 >>> x3 = np.arange(3.0)
 >>> x1 * x3
  ---------------------------------------------------------------------------
  ValueError                                Traceback (most recent call last)
  <ipython-input-52-6814a4c80bf9> in <module>()
  ----> 1 x1 * x3
  ValueError: operands could not be broadcast together with shapes (3,3) (4,) 
继续阅读
  • 我的微信小程序
  • 这是我的微信小程序扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin
qlmx
  • 本文由 发表于 2020年2月7日14:47:22
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接
邓小平传读书笔记 技术杂谈

邓小平传读书笔记

读书感悟 他的名字出生父亲起的邓先圣、先生起了邓希贤,留学还有两个名字,1927年改为邓小平。 想要自己优秀,需要保持一个学习的态度,做好身边的每一件事情,让别人看到你的优秀,同时也要向优秀的人靠拢,...
乔布斯传读书笔记 技术杂谈

乔布斯传读书笔记

我们都有个有钱的邻居,叫做施乐,我闯进他们家准备偷电视的时候,发现你已经把它偷走了 致疯狂的人。他们特立独行,他们桀骜不驯,他们惹是生非,他们格格不入,他们用与众不同的眼光看待事物,他们不喜欢墨守成规...
文本数据增强技术 技术杂谈

文本数据增强技术

文本增强技术学习:链接 数据类别不均衡,导致模型对于小样本类别往往处于欠拟合状态 针对小样本进行数据扩充 处理方式方面分为两个方面: 不变语义,更改表达方式 对原文进行策略调整,如同义词替换 回译技术...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: