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
参数。