我是numpy的新用户,我正在使用numpy delete,其中提到删除水平行我们应该使用axis = 0但是在numpy glossary的其他文档中,它表示水平轴是1.如果有人能让我知道我的理解有什么不对,那就太好了。
答案 0 :(得分:6)
数组是在任何维度的网格中构造数字的系统方法。网格方向具有标签,这些标签来自于如何将新尺寸添加到网格中的约定。
以下是惯例:
最简单的这种网格是一个0维(0D)数组,它具有 no axes
并且只能保存标量。这是一个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轴挤出的数组,返回X
而不使用第1,2和3行。同样的逻辑适用于从中获取值数组。
X[rows_along_0th_axis, columns_along_1st_axis, ..., vectors_along_nth_axis]
答案 1 :(得分:5)
从您提供的链接中获取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
,可以决定移动哪个维度。例如,在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的列不存在。