数组是在任何维度的网格中构造数字的系统方法.网格方向具有标签,这些标签来自如何将新尺寸添加到网格的约定.
这是惯例:
最简单的这种网格是0维(0D)数组,它具有no axes并且只能保持标量.这是一个0D数组:
42
Run Code Online (Sandbox Code Playgroud)
如果我们开始将标量放入列表中,我们会得到一维数组.这个新网格只有一个轴,如果我们想用一个数字标记该轴,我们最好从简单的东西开始 - 比如axis=0!一维数组可以是:
# ----0--->
[42, ?, ?2]
Run Code Online (Sandbox Code Playgroud)
现在我们要创建一个1D数组的数组,它将为我们提供一个2D数组.水平轴仍然是0,但新的垂直轴将获得我们知道的下一个最低数字axis=1.这是它的样子:
# ----0---->
[[42, ?, ?2], # |
[1, 2, 3], # 1
[10, 20, 30]] # V
Run Code Online (Sandbox Code Playgroud)
真正的美是这种概括为无限.如果我们需要一个数字框,我们将通过堆叠2D数组创建一个3D数组,并且自然必须跟踪框的深度方向axis=2.如果我们想要一个4D阵列,我们只需要制作一个盒子列表(3D阵列),并使用索引来调用每个盒子axis=3.这可以永远持续下去.
在NumPy中:
采用axis-argument的任何函数/方法都使用此约定.对于2D数组,这意味着执行类似的操作np.delete(X, [1, 2, 3], axis=0)将迭代沿第0轴挤出的数组,返回X没有第1,2和3行.相同的逻辑适用于从数组中获取值.
X[rows_along_0th_axis, columns_along_1st_axis, ..., vectors_along_nth_axis]
Run Code Online (Sandbox Code Playgroud)
从你提供的链接中,这里有numpy delete和glossary的摘录,可能会引起你的一些困惑和下面的澄清.
Run Code Online (Sandbox Code Playgroud)>>> arr = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]]) >>> arr array([[ 1, 2, 3, 4], [ 5, 6, 7, 8], [ 9, 10, 11, 12]]) >>> np.delete(arr, 1, 0) array([[ 1, 2, 3, 4], [ 9, 10, 11, 12]])
第一个垂直向下跨越行(轴0),第二个水平跨列运行(轴1)
我认为混淆来自第二段摘录中的纵向和横向字样.第二个摘录的含义是通过设置axis可以决定移动哪个维度.例如,在2d矩阵中,axis=0对应于遍历行(因此在数组上垂直移动),而axis=1对应于遍历列(因此在数组上水平移动).它没有说明axis=1如OP所理解的那样对应于水平轴.
该delete函数遵循上述描述,实际上,通过使用np.delete(arr, 1, axis=0),函数迭代行,并删除具有索引1的行.相反,如果要删除列,则axis=1.例如,在同一个数组上arr
>>> np.delete(arr, [0,1,4], axis=1)
array([[ 3, 4],
[ 7, 8],
[11, 12]])
Run Code Online (Sandbox Code Playgroud)
其中delete迭代列,并删除索引为0,1的列,并且没有其他内容被删除,因为索引为4的列不存在.