Python Numpy向量与矩阵加法
如果其中一个操作数是Python Numpy向量与矩阵加法,python,numpy,Python,Numpy,如果其中一个操作数是nx1矩阵,执行法向量加法的最佳方法是什么 我为什么在乎?有时,一个应该返回向量的函数会返回一个nx1矩阵(因为该函数将在矩阵上等效地按元素工作)。当我想进一步处理返回的“向量”时,我总是需要重新塑造——必须有更好的方法 例如: v = np.zeros(shape=(2,1)) w = np.array([1,1]) print('{}, {}'.format(v.shape,w.shape)) 印刷品:(2,1),(2,) [[1.1] [1.1.] [[1] [1.]
nx1
矩阵,执行法向量加法的最佳方法是什么
我为什么在乎?有时,一个应该返回向量的函数会返回一个nx1
矩阵(因为该函数将在矩阵上等效地按元素工作)。当我想进一步处理返回的“向量”时,我总是需要重新塑造——必须有更好的方法
例如:
v = np.zeros(shape=(2,1))
w = np.array([1,1])
print('{}, {}'.format(v.shape,w.shape))
印刷品:(2,1),(2,)
[[1.1]
[1.1.]
[[1]
[1.]](所需的输出!)如果
w
具有所需的结果形状(例如(2,)
),并且v
具有相同的大小(例如(2,1)
,或(2,)
),这是安全和简单的:
w + v.reshape(w.shape)
一般来说,如果您只想去掉最后一个维度,并且知道它的长度为1,则可以执行以下操作:
w + v[..., 0]
如果
w
具有所需的结果形状(例如(2,)
),并且v
具有相同的大小(例如(2,1)
,或(2,)
),这是安全且简单的:
w + v.reshape(w.shape)
一般来说,如果您只想去掉最后一个维度,并且知道它的长度为1,则可以执行以下操作:
w + v[..., 0]
听起来有点像你来自MATLAB,所有的东西都是2d(标量大小是(1,1)),尾随维度是最外层的。或将“向量”视为单列矩阵的线性代数 在
numpy
中,0和1d数组与2d数组一样是普通数组。像(n,)这样的形状很常见。根据广播规则,添加前导维度是自动的(1,n),但添加尾随维度需要用户操作。a[:,None]
是最惯用的,尽管不是唯一的选择
v+w
广播逻辑为
(2,1) + (2,) => (2,1) + (1,2) => (2,2)
自动引导逻辑避免了歧义(如果尝试将(2,)添加到(3,)?),会发生什么情况)。由于主导维度是“最外层的”,所以向那个方向扩展是最有意义的。另一方面,MATLAB“自然地”扩展和收缩尾随维度
因此,在某种程度上,(n,1)形状在numpy
中更为笨拙,尽管它仍然相对容易创建
自动前导尺寸标注的另一个示例:
In [129]: np.atleast_2d(np.arange(3)).shape
Out[129]: (1, 3)
另一方面,expand_dims
让我们在所有地方添加尺寸
In [132]: np.expand_dims(np.arange(3),(0,2,3)).shape
Out[132]: (1, 3, 1, 1)
听起来有点像你来自MATLAB,所有的东西都是2d(标量大小是(1,1)),尾随维度是最外层的。或将“向量”视为单列矩阵的线性代数 在
numpy
中,0和1d数组与2d数组一样是普通数组。像(n,)这样的形状很常见。根据广播规则,添加前导维度是自动的(1,n),但添加尾随维度需要用户操作。a[:,None]
是最惯用的,尽管不是唯一的选择
v+w
广播逻辑为
(2,1) + (2,) => (2,1) + (1,2) => (2,2)
自动引导逻辑避免了歧义(如果尝试将(2,)添加到(3,)?),会发生什么情况)。由于主导维度是“最外层的”,所以向那个方向扩展是最有意义的。另一方面,MATLAB“自然地”扩展和收缩尾随维度
因此,在某种程度上,(n,1)形状在numpy
中更为笨拙,尽管它仍然相对容易创建
自动前导尺寸标注的另一个示例:
In [129]: np.atleast_2d(np.arange(3)).shape
Out[129]: (1, 3)
另一方面,expand_dims
让我们在所有地方添加尺寸
In [132]: np.expand_dims(np.arange(3),(0,2,3)).shape
Out[132]: (1, 3, 1, 1)
可以使用
.T
进行转置,如果需要添加单个维度,也可以在需要时使用,w[:,None]添加额外维度
flatte`也很有用,谢谢你的[:无]提示!“.T”有什么帮助?比重塑更容易.T
与transpose相同您可以使用.T
进行转置,如果需要添加单个维度,也可以在需要时使用,w[:,None]添加额外维度
flatte`也很有用,谢谢你的[:无]提示!“.T”有什么帮助?比重塑更容易.T
与transposso相同,您的最佳做法是删除最后一个维度,如果它是1?有没有办法通过操作符(`+`这里)来“暗示”我不想要广播,或者我需要像@shx2建议的那样对操作数使用[…,0]呢?我把它作为向量保留的问题是:如果我想乘以vector.transpose*矩阵怎么办?对于形状为(n,)的向量,vector.T仍然有形状(n,)而不是(,n),这是什么乘法?不管怎样,x[:,None]*M
都是惯用的numpy
,如果维度需要的话。另外,如果方便保留(n,1)形状,则像np.sum
这样的函数也有一个keep_dims
参数。因此,您的最佳做法是删除最后一个维度,如果它是1?有没有办法通过操作符(`+`这里)来“暗示”我不想要广播,或者我需要像@shx2建议的那样对操作数使用[…,0]呢?我把它作为向量保留的问题是:如果我想乘以vector.transpose*矩阵怎么办?对于形状为(n,)的向量,vector.T仍然有形状(n,)而不是(,n),这是什么乘法?不管怎样,x[:,None]*M
都是惯用的numpy
,如果维度需要的话。如果方便保留(n,1)形状,则类似于np.sum
的函数也有一个keep_dims
参数。