我对narray的形状有以下问题:
out.shape = (20,)
reference.shape = (20,0)
norm = [out[i] / np.sum(out[i]) for i in range(len(out))]
# norm is a list now so I convert it to ndarray:
norm_array = np.array((norm))
norm_array.shape = (20,30)
# error: operands could not be broadcast together with shapes (20,30) (20,)
diff = np.fabs(norm_array - reference)
我如何将norm_array的形状从(20,30)更改为(20,)或引用(20,30),以便我可以减去它们?
编辑:有人可以解释我,为什么他们有不同的形状,如果我可以访问两个单一元素与norm_array[0][0]和引用[0][0]?
我不知道你到底想做什么,但这里有一些关于numpy数组的信息。
1-d numpy数组是一个形状为单值元组的行向量:
>>> np.array([1,2,3]).shape
(3,)
您可以通过传递嵌套列表来创建多维数组。每个子列表是一个长度为1的1-d行向量,有3个子列表。
>>> np.array([[1],[2],[3]]).shape
(3,1)
这里是奇怪的部分。您可以创建相同的数组,但将列表保留为空。最后得到3个长度为0的行向量
>>> np.array([[],[],[]]).shape
(3,0)
这就是你的reference
数组,一个有结构但没有值的数组。这让我回到了我最初的观点:
不能减去空数组
如果我用你描述的形状创建两个数组,我会得到一个错误
In [1856]: norm_array=np.ones((20,30))
In [1857]: reference=np.ones((20,0))
In [1858]: norm_array-reference
...
ValueError: operands could not be broadcast together with shapes (20,30) (20,0)
但是它和你的不一样。但是如果我改变reference
的形状,错误信息就会匹配。
In [1859]: reference=np.ones((20,))
In [1860]: norm_array-reference
...
ValueError: operands could not be broadcast together with shapes (20,30) (20,)
所以你的(20,0)
是错误的。我不知道你是不是打错了什么。
但如果我让reference
2d在最后一个维度上为1,广播工作,产生与(20,30)形状匹配的差值:
In [1861]: reference=np.ones((20,1))
In [1862]: norm_array-reference
如果是reference = np.zeros((20,))
,那么我可以使用reference[:,None]
来添加最后一个维度。
如果reference
是(20,),你不能做reference[0][0]
。reference[0][0]
只适用于最后一个dim值至少为1的2d数组,reference[0,0]
是对2d数组中单个元素进行索引的首选方法。
到目前为止,这是正常的数组尺寸和广播;你可以通过使用来学习。
===============
我对out
的形状感到困惑。如果它是(20,),norm_array
如何最终成为(20,30)。out
必须由20个数组或列表组成,每个数组或列表有30个元素。
如果out
是2d数组,我们可以不迭代地归一化
In [1869]: out=np.arange(12).reshape(3,4)
与列表推导式:
In [1872]: [out[i]/np.sum(out[i]) for i in range(out.shape[0])]
Out[1872]:
[array([ 0. , 0.16666667, 0.33333333, 0.5 ]),
array([ 0.18181818, 0.22727273, 0.27272727, 0.31818182]),
array([ 0.21052632, 0.23684211, 0.26315789, 0.28947368])]
In [1873]: np.array(_) # and to array
Out[1873]:
array([[ 0. , 0.16666667, 0.33333333, 0.5 ],
[ 0.18181818, 0.22727273, 0.27272727, 0.31818182],
[ 0.21052632, 0.23684211, 0.26315789, 0.28947368]])
取行和,并告诉它保持为2d以便于进一步使用
In [1876]: out.sum(axis=1,keepdims=True)
Out[1876]:
array([[ 6],
[22],
[38]])
现在分
In [1877]: out/out.sum(axis=1,keepdims=True)
Out[1877]:
array([[ 0. , 0.16666667, 0.33333333, 0.5 ],
[ 0.18181818, 0.22727273, 0.27272727, 0.31818182],
[ 0.21052632, 0.23684211, 0.26315789, 0.28947368]])