在 numpy 中加入数组的算法

问题描述

我是 numpy 的新手,我了解在较低的形状中“加入数组”的方法,例如 (n1,n2),因为我们可以像矩阵一样进行可视化。

但我不理解更高维度 (n0,....,n_{d-1}) 的逻辑,当然我无法想象。为了形象化,我通常想象一个像树一样的多维数组,所以 (n0,n_{d-1}) 意味着在树的级别(轴)i每个节点都有 n_{我}孩子。所以在 0 级(根)我们有 n0 个孩子,依此类推。

实质上,“连接数组”算法的正式确切定义是什么?

https://numpy.org/doc/stable/reference/routines.array-manipulation.html

解决方法

让我们看看我能说明一些基本的数组操作。

首先制作一个二维数组。从 1d,[0,1,...5] 开始,并将其整形为 (2,3):

In [1]: x = np.arange(6).reshape(2,3)
In [2]: x
Out[2]: 
array([[0,2],[3,4,5]])

我可以沿第一个维度加入 x 的 2 个副本(vstack,v 表示垂直也可以这样做):

In [3]: np.concatenate([x,x],axis=0)
Out[3]: 
array([[0,5],5]])

注意结果是(4,3);没有新的维度。

或者“横向”加入他们:

In [4]: np.concatenate([x,axis=1)
Out[4]: 
array([[0,2,# (2,6) shape
       [3,5,3,5]])

但是如果我将它们提供给 np.array,我会创建一个 3d 数组 (2,3) 形状:

In [5]: np.array([x,x])
Out[5]: 
array([[[0,5]],[[0,5]]])

np.array 的这个动作与从嵌套列表 np.array([[1,4]]) 制作一个二维数组没有什么不同。我们可以添加一层嵌套,就像 Out[5} 一样没有换行符。我倾向于认为这个 3d 数组有 2 个块,每个块有 2 行和 3 列。但名称只是为了方便。

stack 的作用类似于 np.array,构成一个 3d 数组。它实际上将输入数组更改为 (1,3) 形状,并在第一个轴上更改 concatenates

In [6]: np.stack([x,x])
Out[6]: 
array([[[0,5]]])

stack 让我们以其他方式加入数组

In [7]: np.stack([x,axis=1)      # expand to (2,3) and concatante
Out[7]: 
array([[[0,2]],[[3,5]]])
In [8]: np.stack([x,axis=2)       # expand to (2,1) and concatenate
Out[8]: 
array([[[0,0],[1,1],[2,3],[4,4],[5,5]]])

concatenate 和其他 stack 函数不会向基本 numpy 数组添加任何新内容。它们只是提供了一种从现有数组制作新数组的方法。没有任何特殊的 algorithms

如果有帮助,您可以将这些连接函数视为创建一个新的“空白”数组,并用源数组的副本填充它。例如最后一个 stack 可以用:

In [9]: res = np.zeros((2,2),int)
In [10]: res
Out[10]: 
array([[[0,0]],0]]])
In [11]: res[:,:,0] = x
In [12]: res[:,1] = x
In [13]: res
Out[13]: 
array([[[0,5]]])