我是新手,我了解" 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]]])