零维 Numpy 数组的操作

Operations with Numpy arrays with zero dimensions

Is a numpy array of shape (0,10) a numpy array of shape (10).我正在编写一个非常简单的函数,它将在 2 维和 3 维之间交替,我想知道是否有这样的输出:

def Pick(N = 0, F, R, Choice=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]):
    if N==0:
        return np.array(np.random.choice(Choice,size=(F,R)))
    else:
        return np.array(np.random.choice(Choice,size=(N,F,R)))

将与以下输出的行为相同:

 def Pick(N = 0, F, R, Choice=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]):
    return np.array(np.random.choice(Choice,size=(N,F,R)))
     

理论上这些应该是相同的,但是当我尝试时。

a =np.full((10,10,10),1)

然后

a+a 

我得到 (10,10,10) np.array 个 2。但是如果我尝试

b=np.full((0,10,10,10),1)

然后

b+b 

这是我收到的唯一结果

 array([], shape=(0, 10, 10, 10), dtype=int64)

关于这是为什么的任何想法?

抽象地说,形状为 (N,M,L) 的数组可以用形状为 (<>,N,<>,M,<>,L,<>) 的数组表示,其中 <>可以替换为具有任意有限长度的 1 序列。考虑每个数据点对应的索引集合——如果一个维度的长度为0,那么该维度对应的数据点可以承载什么索引?这应该可以解释为什么定义一个 numpy 数组会产生 [] 结果——因为你定义了一个空数组。定义

a = np.full((10,10,10),1)
b = np.full((10,10,10,1),1)

a+b 

操作适当地广播(并)产生预期的结果。

0 维度与 1、2 或其他正整数具有相同的含义:

In [437]: np.ones((2,3),int)                                                                         
Out[437]: 
array([[1, 1, 1],        # 2*3 elements
       [1, 1, 1]])
In [438]: np.ones((1,3),int)                                                                         
Out[438]: array([[1, 1, 1]])          # 1*3 elements
In [439]: np.ones((0,3),int)                                                                         
Out[439]: array([], shape=(0, 3), dtype=int64)     # 0*3 elements