numpy的加减乘除运算

您所在的位置:网站首页 numpy数组增加一行 numpy的加减乘除运算

numpy的加减乘除运算

2023-03-16 04:20| 来源: 网络整理| 查看: 265

numpy中最常见的操作是张量/矩阵的四则运算,但是numpy中的乘法常常让人混淆,这里特别实验并记录。本文概要如下:

numpy.matrix 和 numpy.array 四则运算的总结 numpy.matrix 和 numpy.array 数据结构 numpy.matrix 和 numpy.array的 + - / 运算总结 numpy.dot * numpy.matmul numpy.multiply 运算的总结 结论、 numpy 中四则运算总结np.matrix np.array 的 + - / np.multiply 操作都是逐元素的 np.matmul 对于 np.matrix np.array 都是张量乘法,需要满足乘法的一个元素的列等于第二个元素的行的条件。 * 对 np.matrix 操作是矩阵乘法,需要满足矩阵乘法条件,而 * 对 np.array 是逐元素乘法。 一、 numpy 中的 matrix 和 array

numpy.array 是 numpy 中最常见的数据结构,用于表示多维数组,在数学上就是一个张量。张量的维度不同时候,会变换为不同的结构:

dimension > 2 普通张量 dimension == 2 矩阵 dimension == 1 矢量 dimension == 0 标量

其中在 dimension numpy. array numpy.array dimension numpy.matrix

如果非要用 dimension > 2 的 array 来构建 numpy.matrix , 则会报错:

In [0]: a = np.matrix([[[1,]]]) --------------------------------------------------------------------------- ValueError Traceback (most recent call last) in ----> 1 a = np.matrix([[[1,]]]) ~/Library/Python/3.8/lib/python/site-packages/numpy/matrixlib/defmatrix.py in __new__(subtype, data, dtype, copy) 147 shape = arr.shape 148 if (ndim > 2): --> 149 raise ValueError("matrix must be 2-dimensional") 150 elif ndim == 0: 151 shape = (1, 1) ValueError: matrix must be 2-dimensional二、 numpy 中的 + - / 运算1.如果shape相同,则是逐个元素运算

直接看例子, numpy.array 和 numpy.matrix 操作结果一样。

In [15]: a = np.matrix([1,2]) In [16]: b = np.matrix([3,4]) In [17]: a + b Out[17]: matrix([[4, 6]]) In [18]: a - b Out[18]: matrix([[-2, -2]]) In [19]: a / b Out[19]: matrix([[0.33333333, 0.5 ]]) In [20]: np.multiply(a, b) Out[20]: matrix([[3, 8]])2. 如果shape不同,需要考虑广播broadcast

numpy 有广播机制,简单来说,就是两个 np.array 的 shape 不相同的时候,在特定情况下,会将一个 shape 做一个填充,然后进行运算。

In [15]: a = np.matrix([1,2]) In [21]: c = np.matrix([[1,2],[3,4]]) In [22]: a + c Out[22]: matrix([[2, 4], [4, 6]]) In [23]: a.shape Out[23]: (1, 2) In [24]: c.shape Out[24]: (2, 2)

上面的例子中,有 a 和 c 的 shape 不一样,行不同但是列相同,做加法运算的时候把 a 按照行复制了,然后再做运算。这里其实用到了广播机制(broadcast) :

找到所有输入array中dimension最大的。即 max(len(array.shape))) ,其它的如果dimension不够,则自动在 shape 的前面填1。 如果最大的dimension为3, 实际上一个array的 shape 是 (2, 3) , 则会变成 (1, 2, 3) 。对于一个逐元素运算,经过填充和计算,得到最终结果的 shape 。 这个 shape 某一维的值为 dn (大于 1 ),其它的array在填充的时候,如果对应这一维的值是 dni :dni == dn 不用复制 dni == 1 当前维填充到 dn , 方式是复制当前维度的值dni为其它值,则报错 ValueError: frames are not aligned

三、 numpy 中的乘法

numpy 中有一堆表示乘法的运算。

numpy.dot 输入包含矢量时候则是内积,不是矢量时候,则是矩阵乘法 numpy.matmul 是矩阵乘法 * 对 numpy.matrix 是矩阵乘法,需要满足矩阵乘法条件, 对 numpy.array 是逐元素乘法 numpy.multiply 逐元素相乘

1 numpy.dot 内积

当两个矢量相乘时候,内积是一个数,此时需要满足矢量的元素数目相同或者广播机制当矢量和张量(维度大于等于2)相乘时候,结果是张量乘法In [72]: a = np.ones(shape=(5,)) In [73]: b = np.ones(shape=(5,)) In [74]: c = np.dot(a,b) In [75]: c.shape Out[75]: () In [76]: type(c) Out[76]: numpy.float64 In [77]: c Out[77]: 5.0 In [78]: np.dot(a,b) == np.matmul(a,b) Out[78]: True

numpy.dot 还可以做为成员函数:

In [94]: a = np.ones(shape=(2,2)) In [95]: b = np.ones(shape=(2,2)) In [96]: a.dot(b) Out[96]: array([[2., 2.], [2., 2.]])

2. numpy.matmul 是矩阵乘法

需要满足矩阵或者张量乘法的条件。

3. * 对于 numpy.matrix 是 矩阵乘法,对于 numpy.array 是逐元素乘法

In [80]: a = np.ones(shape=(2,2)) In [81]: b = a.copy() In [82]: a * b Out[82]: array([[1., 1.], [1., 1.]]) In [83]: c = np.matrix(a) In [84]: d = c.copy() In [85]: c * d Out[85]: matrix([[2., 2.], [2., 2.]])

4. numpy.multiply 就是对应元素相乘

In [99]: a = np.ones(shape=(2,2)) In [100]: b = np.ones(shape=(2,2)) In [101]: c = np.multiply(a,b) In [102]: c Out[102]: array([[1., 1.], [1., 1.]])



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3