Numpy排名> 1和维度之一== 0

时间:2012-05-18 17:39:58

标签: python numpy

我正在实现一个将文件中的数据读入多维numpy数组的函数。数据在维度长度方面有规律地结构化,但是,某些维度可能会丢失,在这种情况下,我会让该维度的长度为0。所以我偶然发现了这种行为:

In [1]: np.random.random((3,3))
Out[1]: 
array([[ 0.59756568,  0.47198749,  0.23442854],
       [ 0.29374254,  0.58289927,  0.40497268],
       [ 0.00481053,  0.63471263,  0.90053086]])

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

好的,所以我得到一个空数组。如果我将其看作第二维和第三维是第一维的子集,这是有意义的,这是零,因此整个数组是零。但是,我希望np.random.random((3,3,0))等同于np.random.random((3,3))。然而,

In [3]: np.random.random((3,3,0))
Out[3]: array([], shape=(3, 3, 0), dtype=float64)

再次出现一个空数组。

这是预期的行为吗?我理解np.array((3,3))np.array((3,3,1))np.array((1,3,3))之间的区别,但我正在寻找解释为什么长度0的维度会使整个数组退化而不仅仅是维度。它只是我,还是这个Python / numpy WTF?

1 个答案:

答案 0 :(得分:1)

正如我在评论中所说,你得到一个空数组,因为如果任何维度为零,数组的大小总是为零。我可以问你想做什么吗?如果您想要一个空的第三维,您可以尝试以下内容:

>>> x = numpy.random.random((3,3))
>>> y = x[..., numpy.newaxis]
>>> y

array([[[ 0.92418241],
        [ 0.76716579],
        [ 0.82485034]],

       [[ 0.30571695],
        [ 0.71012271],
        [ 0.54609355]],

       [[ 0.98192734],
        [ 0.25505518],
        [ 0.75473749]]])

>>> y.shape
(3, 3, 1)

>>> x.shape
(3, 3)