Skip to main content
 首页 » 编程设计

python之rank > 1 且维度之一 == 0 的 Numpy 数组

2025年05月04日9kuangbin

我正在实现一个将文件中的数据读取到多维 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)) 和 np.array((3,3,1)) 或 np.array( (1,3,3)),但我正在寻找一个解释,为什么长度为 0 的维度会退化整个数组,而不仅仅是那个维度。是我一个人,还是这是 Python/numpy WTF 之一?

请您参考如下方法:

正如我在评论中所述,您将得到一个空数组,因为如果任何维度为零,则数组的大小始终为零。我能问一下你想做什么吗?如果你想要一个空的 3rd 维度,你可以尝试类似下面的东西:

>>> 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)