numpy 数组的形状

shape of numpy array

有一个传入的 numpy 数组,可以是一维或二维。我正在尝试使用 shape 属性 查找行数。对于一维数组,我的计算 x.shape[0] 失败了,它没有给出 (1,6)。关于如何计算 # of row 与数组是 1-d 还是 2-d 无关的任何建议?

二维数组:

>>> x4
array([[1, 2, 3],
       [3, 4, 5]])
>>> x4.shape
(2, 3)
>>> row, col = x4.shape

一维数组

>>> x3
array([1, 2, 3, 3, 4, 5])
>>> x3.shape
(6,)

您可以查看最后一个维度的大小,而不是 -1:

>>> x3.shape[-1]
6

>>> x4.shape[-1]
3

但是,要获得类似的二维和一维数组的 broadcasted 形状,您可能需要解压形状并使用 1 作为默认行数:

>>> *r, c = x3.shape
>>> ((r or [1])[0], c)
(1, 6)

>>> *r, c = x4.shape
>>> ((r or [1])[0], c)
(2, 3)

这意味着:

  • 如果数组是1Dr是一个空的list[] , 即 , 所以你最终得到 (r or [1])[0] 等于 [1][0], 1.

  • 如果数组是 2Dr 是一个包含行数的 list它的第一个元素,一个非空的 list 是真实的,所以你最终得到 r[0].

有关 Python.

中星号 * 用法的更多信息,请参阅 extending iterable unpacking

另一种方法是直接在形状前添加 1。然后,提取那个 元组 的最后两个元素。这将 return 正确的行号和列号,无论它是一维数组还是二维数组:

>>> ((1,) + x3.shape)[-2:]
(1, 6)

>>> ((1,) + x4.shape)[-2:]
(2, 3)

你想要形状的最后一个值吗?

x1 = np.ones(10)
x1.shape([-1])

x2 = np.ones((10,6))
x2.shape([-1])

您可以使用 atleast_2d 添加前导维度:

In [56]: np.atleast_2d(np.arange(3))
Out[56]: array([[0, 1, 2]])
In [57]: _.shape
Out[57]: (1, 3)
In [58]: np.atleast_2d(np.ones((2,3)))
Out[58]: 
array([[1., 1., 1.],
       [1., 1., 1.]])
In [59]: _.shape
Out[59]: (2, 3)

但看看它的代码 - 它隐藏了一个维度测试。

    elif ary.ndim == 1:
        result = ary[_nx.newaxis, :]