如何在NumPy数组中选择轴值

3

我是numpy的新用户,正在使用numpy的delete函数。文档中提到,要删除水平行,我们应该使用axis=0,但在numpy的词汇表中,它说水平轴是1。如果有人能告诉我我的理解有什么问题就太好了。

2个回答

6

数组是一种按照任意维度进行数字结构化的系统方法。网格方向有标签,这些标签来自于网格添加新维度的约定。

以下是该约定:

最简单的网格是0维(0D)数组,它没有轴,只能保存一个标量。这是一个0D数组:

42

如果我们把标量放进一个列表里,就会得到一个一维数组。这个新的网格只有一个轴,如果我们想用一个数字给这个轴标记,最好从简单的开始 - 比如axis=0!一个一维数组可能是:

# ----0--->
 [42, π, √2]

现在我们想要创建一个由1D数组组成的数组,这将给我们一个2D数组。水平轴仍然是0,但新的垂直轴将得到我们所知道的下一个最低数字axis=1。以下是可能的样子:
# ----0---->
[[42, π,  √2],  # |
 [1,  2,   3],  # 1
 [10, 20, 30]]  # V

真正的美妙之处在于这种方法具有无限推广性。如果我们需要一个数字盒子,我们可以通过将2D数组堆叠起来创建一个3D数组,而追踪盒子深度的方向自然必须是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感到困惑。有两个需要修改的地方。首先是关于约定:只有当数组是单个列表(例如np.array([1,2,3,4]))时,axis=0对应于迭代列的情况。一般来说,axis对应于要迭代的实际维度。例如,axis=0允许在行上迭代,而axis=1则在列上迭代。矩阵的形状是(num_rows,num_cols)。其次,是对numpy数组的访问:在矩阵上,行可以通过indices_axis_0进行访问,而列可以通过indices_axis_1进行访问。 - albertoql
谢谢您的评论!您说得有道理。您能解释一下“其次,是对numpy数组的访问:可以使用indices_axis_0访问矩阵行,使用indices_axis_1访问列”是什么意思吗? - Ulf Aslak
根据您所描述的约定,X[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

5

根据您提供的链接,以下是numpy deleteglossary的摘录,可能会让您感到困惑,下面进行澄清。

  1. 摘录
>>> 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]])

  1. 摘录

第一个轴沿着行(轴0)垂直向下运行,第二个轴沿着列(轴1)水平运行。


我认为混淆来自第二个摘录中的“垂直”和“水平”这两个词。第二个摘录的意思是通过设置轴,可以决定沿哪个维度移动。例如,在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]])

其中delete迭代列,并删除索引为0、1的列,由于索引为4的列不存在,因此不会删除其他任何内容。


清晰明了。直接易懂。很好。 - Reti43

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接