【发布时间】:2017-02-18 23:04:22
【问题描述】:
当我们有一个numpy 数组,并且想要沿一个轴执行操作时,为什么axis=1 相当于跨行 工作,而axis=0 相当于向下工作列?
如下例所示,创建numpy 数组需要通过 kwarg size 指定维度:
np.random.randint: (low, high=None, size=None, dtype='l')
这是一个元组,例如(形式:size=(number_of_rows, number_of_columns)
>>> import numpy as np
>>> a = np.random.randint(0, 20, (3, 4))
>>> a
array([[16, 7, 4, 7],
[ 4, 10, 8, 5],
[ 7, 1, 15, 7]])
>>> np.sum(a, axis=0)
array([27, 18, 27, 19])
>>> np.sum(a, axis=1)
array([34, 27, 30])
>>> a.shape[0]
3
>>> a.shape[1]
4
行的求和是通过设置axis=1来执行的,我期望axis=0。
这样做有充分的理由吗?每次使用它都会让我感到困惑,直到我习惯了它。为什么它与(在我看来!)索引数组的标准方式相矛盾,就像代码中带有 shape 属性的示例一样?
更新
这里还有一些(令人困惑的?)代码,表明axis=0 适用于一维数组,正如人们所预料的那样。
>>> b
array([1, 2, 3, 2, 3, 4])
>>> np.sum(b, axis=0)
15
>>> np.sum(b, axis=1)
Traceback (most recent call last):
File "<input>", line 1, in <module>
np.sum(b, axis=1)
File "/usr/local/lib/python3.6/site-packages/numpy/core/fromnumeric.py", line 1814, in sum
out=out, **kwargs)
File "/usr/local/lib/python3.6/site-packages/numpy/core/_methods.py", line 32, in _sum
return umr_sum(a, axis, dtype, out, keepdims)
ValueError: 'axis' entry is out of bounds
我希望这是默认设置,因为一维数组实际上只能在一个方向上求和。 感谢您在 cmets 中的输入。我认为斯蒂芬关于表现的答案是正确的。是在 numpy 中产生这个小怪癖,成为常态。
【问题讨论】:
-
几个月前我回答了这个问题。我得查一下。暂时忘记第 v 行的列名。如果
a是1d,a.sum(axis=0)做什么?使用 2d 时,什么扩展是一致的?用 3d 吗? -
这有帮助吗:stackoverflow.com/questions/41733479/…;那里的海报试图在 3d 案例中理解
axis。在某些方面,这比 2d 情况更清楚。sum(axis=i)删除ith维度,并保留其余部分。
标签: python arrays numpy indexing