2

我正在实现一个将文件中的数据读取到多维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)

好的,所以我得到一个空数组。如果我将其视为第 2 维和第 3 维是第 1 维的子集,即为 nil,则这是有道理的,因此整个数组为 nil。但是,我希望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))我理解and np.array((3,3,1))or之间的区别np.array((1,3,3)),但我正在寻找一个解释,为什么长度维度会0退化整个数组而不仅仅是那个维度。只是我,还是这是 Python/numpy WTF 之一?

4

1 回答 1

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)
于 2012-05-18T17:58:24.817 回答