如何解决在 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]]])
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。