如何从 NumPy 矩阵中的列而不是行中减去?
How to subtract from columns and not rows in NumPy matrices?
我有一个矩阵X
:
[[ 2. nan nan nan]
[ 3. 2. nan nan]
[ nan 5. 5. nan]
[ nan nan nan nan]]
还有一个列表b
:
[-1.0, 2.0, 0.5, -2.0]
当我执行 X - b
时,我得到:
[[ 3. nan nan nan]
[ 4. 0. nan nan]
[ nan 3. 4.5 nan]
[ nan nan nan nan]]
如果我想跨列而不是跨行减去 b
怎么办?
我正在寻找 X - b.transpose()
:
[[ 3. nan nan nan]
[ 1. 0. nan nan]
[ nan 4.5 4.5 nan]
[ nan nan nan nan]]
使用numpy.vstack函数的解决方案(垂直堆叠数组):
a = np.array([[ 2.0, np.NaN, np.NaN, np.NaN],
[ 3.0, 2.0, np.NaN, np.NaN],
[ np.NaN, 5.0, 5.0, np.NaN],
[ np.NaN, np.NaN, np.NaN, np.NaN]])
b = np.array([-1.0, 2.0, 0.5, -2.0])
print(a - np.vstack(b))
输出:
[[ 3. nan nan nan]
[ 1. 0. nan nan]
[ nan 4.5 4.5 nan]
[ nan nan nan nan]]
这里有一个值得指出的问题:
>>> a = np.identity(4)
>>> a
array([[ 1., 0., 0., 0.],
[ 0., 1., 0., 0.],
[ 0., 0., 1., 0.],
[ 0., 0., 0., 1.]])
>>> b = [1,2,3,4]
>>> a-b
array([[ 0., -2., -3., -4.],
[-1., -1., -3., -4.],
[-1., -2., -2., -4.],
[-1., -2., -3., -3.]])
>>> a-np.matrix(b)
matrix([[ 0., -2., -3., -4.],
[-1., -1., -3., -4.],
[-1., -2., -2., -4.],
[-1., -2., -3., -3.]])
>>> a-np.array(b)
array([[ 0., -2., -3., -4.],
[-1., -1., -3., -4.],
[-1., -2., -2., -4.],
[-1., -2., -3., -3.]])
>>> a-np.matrix(b).T # T is short for transpose()
matrix([[ 0., -1., -1., -1.],
[-2., -1., -2., -2.],
[-3., -3., -2., -3.],
[-4., -4., -4., -3.]])
但是:
>>> a-np.array(b).T
array([[ 0., -2., -3., -4.],
[-1., -1., -3., -4.],
[-1., -2., -2., -4.],
[-1., -2., -3., -3.]])
对于一维数组 .T
什么都不做!改用
>>> a-np.array(b)[:, None]
array([[ 0., -1., -1., -1.],
[-2., -1., -2., -2.],
[-3., -3., -2., -3.],
[-4., -4., -4., -3.]])
我有一个矩阵X
:
[[ 2. nan nan nan]
[ 3. 2. nan nan]
[ nan 5. 5. nan]
[ nan nan nan nan]]
还有一个列表b
:
[-1.0, 2.0, 0.5, -2.0]
当我执行 X - b
时,我得到:
[[ 3. nan nan nan]
[ 4. 0. nan nan]
[ nan 3. 4.5 nan]
[ nan nan nan nan]]
如果我想跨列而不是跨行减去 b
怎么办?
我正在寻找 X - b.transpose()
:
[[ 3. nan nan nan]
[ 1. 0. nan nan]
[ nan 4.5 4.5 nan]
[ nan nan nan nan]]
使用numpy.vstack函数的解决方案(垂直堆叠数组):
a = np.array([[ 2.0, np.NaN, np.NaN, np.NaN],
[ 3.0, 2.0, np.NaN, np.NaN],
[ np.NaN, 5.0, 5.0, np.NaN],
[ np.NaN, np.NaN, np.NaN, np.NaN]])
b = np.array([-1.0, 2.0, 0.5, -2.0])
print(a - np.vstack(b))
输出:
[[ 3. nan nan nan]
[ 1. 0. nan nan]
[ nan 4.5 4.5 nan]
[ nan nan nan nan]]
这里有一个值得指出的问题:
>>> a = np.identity(4)
>>> a
array([[ 1., 0., 0., 0.],
[ 0., 1., 0., 0.],
[ 0., 0., 1., 0.],
[ 0., 0., 0., 1.]])
>>> b = [1,2,3,4]
>>> a-b
array([[ 0., -2., -3., -4.],
[-1., -1., -3., -4.],
[-1., -2., -2., -4.],
[-1., -2., -3., -3.]])
>>> a-np.matrix(b)
matrix([[ 0., -2., -3., -4.],
[-1., -1., -3., -4.],
[-1., -2., -2., -4.],
[-1., -2., -3., -3.]])
>>> a-np.array(b)
array([[ 0., -2., -3., -4.],
[-1., -1., -3., -4.],
[-1., -2., -2., -4.],
[-1., -2., -3., -3.]])
>>> a-np.matrix(b).T # T is short for transpose()
matrix([[ 0., -1., -1., -1.],
[-2., -1., -2., -2.],
[-3., -3., -2., -3.],
[-4., -4., -4., -3.]])
但是:
>>> a-np.array(b).T
array([[ 0., -2., -3., -4.],
[-1., -1., -3., -4.],
[-1., -2., -2., -4.],
[-1., -2., -3., -3.]])
对于一维数组 .T
什么都不做!改用
>>> a-np.array(b)[:, None]
array([[ 0., -1., -1., -1.],
[-2., -1., -2., -2.],
[-3., -3., -2., -3.],
[-4., -4., -4., -3.]])