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