numpy中连接数组的算法



我是新手,我了解" join数组"在较低的形状,如(n1, n2),因为我们可以可视化,像一个矩阵。

但是我不理解高维(0,....)的逻辑(n {d-1})当然我无法想象。为了形象化,我通常把多维数组想象成树,所以(0,...., n_{d-1})表示在树的第i层(轴),每个节点有n {i}个子节点。所以在第0层(根结点)我们没有子结点,以此类推。

"join arrays"的确切定义是什么?算法?

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

让我们看看我可以演示一些基本的数组操作。

首先创建一个2d数组。从1d开始,[0,1,…]5],重塑为(2,3):

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

我可以沿着第一维连接x的2个副本(vstack, v代表垂直也可以这样做):

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

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

或者将它们'水平'连接:

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

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

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

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

stack的行为像np.array,使3d数组。它实际上将输入数组更改为(1,2,3)shape,并在第一个轴上更改为concatenates

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

stack允许我们以其他方式连接数组

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

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

如果有帮助的话,你可以把这些连接函数想象成创建一个新的"blank"数组,并用源数组的副本填充它。例如,最后一个stack可以用:

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

相关内容

  • 没有找到相关文章