数组是一种按照任意维度进行数字结构化的系统方法。网格方向有标签,这些标签来自于网格添加新维度的约定。
以下是该约定:
最简单的网格是0维(0D)数组,它没有轴
,只能保存一个标量。这是一个0D数组:
42
如果我们把标量放进一个列表里,就会得到一个一维数组。这个新的网格只有一个轴,如果我们想用一个数字给这个轴标记,最好从简单的开始 - 比如axis=0
!一个一维数组可能是:
# ----0--->
[42, π, √2]
axis=1
。以下是可能的样子:# ----0---->
[[42, π, √2], # |
[1, 2, 3], # 1
[10, 20, 30]] # V
axis=2
。如果我们想要一个4D数组,我们只需制作一个盒子列表(3D数组),并使用沿着axis=3
的索引调用每个盒子。这可以无限延续。
在NumPy中:
任何带有axis
参数的函数/方法都使用此约定。对于一个2D数组,这意味着执行类似于np.delete(X, [1, 2, 3], axis=0)
的操作将遍历沿着第0轴拉伸的数组,从而返回没有第1、第2和第3行的X
。同样的逻辑也适用于从数组中获取值。
X[rows_along_0th_axis, columns_along_1st_axis, ..., vectors_along_nth_axis]
根据您提供的链接,以下是numpy delete和glossary的摘录,可能会让您感到困惑,下面进行澄清。
>>> 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 = 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]])
其中delete
迭代列,并删除索引为0、1的列,由于索引为4的列不存在,因此不会删除其他任何内容。
np.array([1,2,3,4])
)时,axis=0
对应于迭代列的情况。一般来说,axis
对应于要迭代的实际维度。例如,axis=0
允许在行上迭代,而axis=1
则在列上迭代。矩阵的形状是(num_rows,num_cols)
。其次,是对numpy
数组的访问:在矩阵上,行可以通过indices_axis_0进行访问,而列可以通过indices_axis_1进行访问。 - albertoqlX[index_on_1st_axis, index_on_0th_axis]
是正确的。然而,从numpy中axis
的含义来看,它应该相反,即X[index_on_0th_axis, index_on_1st_axis]
。例如,考虑np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
,其形状为(3,4),因此在轴0上,最大索引是2(行),在轴1上,最大索引是3(列)。这个澄清是由我评论中的第一个观点引起的。 - albertoql