Python Numpy的意思是现在需要重塑?

Python Numpy的意思是现在需要重塑?,python,numpy,Python,Numpy,我想用列的平均值减去numpy数组中的所有值 以前,以下代码起作用: centered_data = data - data.mean(axis = 1) 现在,此代码生成如下错误消息: ValueError:操作数无法与形状3862 3一起广播 将此行更改为: centered_data = data - data.mean(axis = 1).reshape(data.shape[0],1) 数据的类型为numpy.ndarray 为什么平均向量现在需要重塑,而以前没有呢?请看下面的例子

我想用列的平均值减去numpy数组中的所有值

以前,以下代码起作用:

centered_data = data - data.mean(axis = 1)
现在,此代码生成如下错误消息:

ValueError:操作数无法与形状3862 3一起广播

将此行更改为:

centered_data = data - data.mean(axis = 1).reshape(data.shape[0],1)
数据的类型为numpy.ndarray

为什么平均向量现在需要重塑,而以前没有呢?

请看下面的例子

根据第一条广播规则:

在两个阵列上操作时,NumPy会比较它们的形状 元素方面。它从后面的尺寸标注开始,然后开始工作 前进的道路。当需要时,两个维度是兼容的

它们相等,或者其中一个为1

因此,将3与862进行比较是失败的。因此,您需要将数据重塑为862,3或平均值为3,1。

请查看

根据第一条广播规则:

在两个阵列上操作时,NumPy会比较它们的形状 元素方面。它从后面的尺寸标注开始,然后开始工作 前进的道路。当需要时,两个维度是兼容的

它们相等,或者其中一个为1


因此,将3与862进行比较是失败的。因此,您需要将数据重塑为862,3或平均值为3,1。

您还可以将轴添加到阵列中,以便它将广播

>>> a
array([[ 0,  1,  2,  3,  4,  5,  6,  7],
       [ 8,  9, 10, 11, 12, 13, 14, 15],
       [16, 17, 18, 19, 20, 21, 22, 23]])
>>> m = a.mean(-1)
>>> a.shape, m.shape
((3, 8), (3,))
>>> a - m[:, np.newaxis]
array([[-3.5, -2.5, -1.5, -0.5,  0.5,  1.5,  2.5,  3.5],
       [-3.5, -2.5, -1.5, -0.5,  0.5,  1.5,  2.5,  3.5],
       [-3.5, -2.5, -1.5, -0.5,  0.5,  1.5,  2.5,  3.5]])
>>> 
>>> m[:, np.newaxis].shape
(3, 1)
>>> 

您还可以将轴添加到阵列中,以便阵列将进行广播

>>> a
array([[ 0,  1,  2,  3,  4,  5,  6,  7],
       [ 8,  9, 10, 11, 12, 13, 14, 15],
       [16, 17, 18, 19, 20, 21, 22, 23]])
>>> m = a.mean(-1)
>>> a.shape, m.shape
((3, 8), (3,))
>>> a - m[:, np.newaxis]
array([[-3.5, -2.5, -1.5, -0.5,  0.5,  1.5,  2.5,  3.5],
       [-3.5, -2.5, -1.5, -0.5,  0.5,  1.5,  2.5,  3.5],
       [-3.5, -2.5, -1.5, -0.5,  0.5,  1.5,  2.5,  3.5]])
>>> 
>>> m[:, np.newaxis].shape
(3, 1)
>>> 
问:为什么平均向量现在需要整形

答:因为NumPy无法在n,和n之间执行操作,。要广播,NumPy将查找轴兼容性,1与任何轴兼容

(3,862) -
(3,) # error
(3,1) # this works
(1,1) # this works
(,862) # error
(1,862) # works
问:为什么平均向量现在需要整形

答:因为NumPy无法在n,和n之间执行操作,。要广播,NumPy将查找轴兼容性,1与任何轴兼容

(3,862) -
(3,) # error
(3,1) # this works
(1,1) # this works
(,862) # error
(1,862) # works
np.mean有一个keepdims参数。data.mean也有,但在np.mean中有记录:

如果没有这一点,像mean和sum这样的操作将删除一个维度。重塑-1,1和[:,无]也可以将尺寸标注添加回

如果在另一个轴上取平均值,则无需保留或恢复尺寸。这是因为如果需要,广播规则会在开始时自动添加维度:

In [645]: data-data.mean(axis=0)
Out[645]: 
array([[-4., -4., -4., -4.],
       [ 0.,  0.,  0.,  0.],
       [ 4.,  4.,  4.,  4.]])
您的“之前”案例是这样的吗?轴上的减少=0

我不知道numpy中有任何变化会使axis=1的情况下不需要某种形状的重塑或keepaxis

如果data.shape==3,4

工作

这会引发一个值错误:

data+np.array([1,1,1])
ValueError: operands could not be broadcast together with shapes (3,4) (3) 
这项工作:

data+np.array([1,1,1])[:,None]
np.mean有一个keepdims参数。data.mean也有,但在np.mean中有记录:

如果没有这一点,像mean和sum这样的操作将删除一个维度。重塑-1,1和[:,无]也可以将尺寸标注添加回

如果在另一个轴上取平均值,则无需保留或恢复尺寸。这是因为如果需要,广播规则会在开始时自动添加维度:

In [645]: data-data.mean(axis=0)
Out[645]: 
array([[-4., -4., -4., -4.],
       [ 0.,  0.,  0.,  0.],
       [ 4.,  4.,  4.,  4.]])
您的“之前”案例是这样的吗?轴上的减少=0

我不知道numpy中有任何变化会使axis=1的情况下不需要某种形状的重塑或keepaxis

如果data.shape==3,4

工作

这会引发一个值错误:

data+np.array([1,1,1])
ValueError: operands could not be broadcast together with shapes (3,4) (3) 
这项工作:

data+np.array([1,1,1])[:,None]

我喜欢这个解释来补充文档:我喜欢这个解释来补充文档: