Python/Numpy中关于数组/向量的空第二维问题

9
我有一个看起来很简单的问题。
观察以下代码:
In : x=np.array([0, 6])
Out: array([0, 6])
In : x.shape
Out: (2L,)

这说明该数组没有第二个维度,因此 xx.T 没有区别。

我怎样才能使 x 有 (2L,1L) 的维度?这个问题背后的真正动机是我有一个形状为 [3L,4L] 的数组 y,我想让 y.sum(1) 成为可转置等的向量。


NumPy数组具有reshape()方法,或者您也可以添加一个额外的维度。 - Ashwini Chaudhary
2个回答

7

虽然你可以使用[:,np.newaxis]来重塑数组并添加维度,但你应该熟悉最基本的嵌套括号或列表表示法。请注意它与显示的匹配。

In [230]: np.array([[0],[6]])
Out[230]: 
array([[0],
       [6]])
In [231]: _.shape
Out[231]: (2, 1)

np.array也接受一个ndmin参数,但它会在开始处添加额外的维度(这是numpy的默认位置)。

In [232]: np.array([0,6],ndmin=2)
Out[232]: array([[0, 6]])
In [233]: _.shape
Out[233]: (1, 2)

将某物制成2D的经典方法 - 改变形状:

In [234]: y=np.arange(12).reshape(3,4)
In [235]: y
Out[235]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
< p > sum(以及相关函数)具有keepdims参数。请阅读文档。

In [236]: y.sum(axis=1,keepdims=True)
Out[236]: 
array([[ 6],
       [22],
       [38]])
In [237]: _.shape
Out[237]: (3, 1)

empty 2nd dimension 不是很准确的术语,更像是不存在的第二维。

一个维度可以有0个项:

In [238]: np.ones((2,0))
Out[238]: array([], shape=(2, 0), dtype=float64)

如果你更熟悉最少有2d的MATLAB,你可能会喜欢np.matrix子类。它采取措施确保大多数操作返回另一个2d矩阵:

In [247]: ym=np.matrix(y)
In [248]: ym.sum(axis=1)
Out[248]: 
matrix([[ 6],
        [22],
        [38]])

矩阵的 sum 功能是:
np.ndarray.sum(self, axis, dtype, out, keepdims=True)._collapse(axis)
_collapse 位允许它为 ym.sum() 返回标量。

有没有办法将keepdims=True设置为默认值?一遍又一遍地输入太麻烦了。 - Lepidopterist
对我来说,似乎对一个(2L,)数组进行转置应该让numpy意识到你想要一个(1L,2L)的数组。 - Lepidopterist
np.matrix类。 - hpaulj
不知道 keepdims,太好了! - uhoh

3

还有一个要记住的点是保留尺寸信息:

In [42]: X
Out[42]: 
array([[0, 0],
       [0, 1],
       [1, 0],
       [1, 1]])

In [43]: X[1].shape
Out[43]: (2,)

In [44]: X[1:2].shape
Out[44]: (1, 2)

In [45]: X[1]
Out[45]: array([0, 1])

In [46]: X[1:2]  # this way will keep dimension
Out[46]: array([[0, 1]])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接