Python 关于轴的Numpy索引逻辑
当我们有一个Python 关于轴的Numpy索引逻辑,python,arrays,numpy,indexing,Python,Arrays,Numpy,Indexing,当我们有一个numpy数组,并且希望沿一个轴执行操作时,为什么axis=1相当于跨行工作,而axis=0相当于向下工作列 从下面的示例中可以看出,创建numpy数组需要通过kwarg大小指定尺寸,如下所示: np.random.randint: (low, high=None, size=None, dtype='l') 这是一个元组,例如(形式:size=(行数、列数) 通过设置轴=1(我希望轴=0)来执行跨行的求和 这有什么好的理由吗?每次使用它都会让我感到困惑,直到我完全习惯了它。为什么
numpy
数组,并且希望沿一个轴执行操作时,为什么axis=1
相当于跨行工作,而axis=0
相当于向下工作列
从下面的示例中可以看出,创建numpy
数组需要通过kwarg大小指定尺寸,如下所示:
np.random.randint: (low, high=None, size=None, dtype='l')
这是一个元组,例如(形式:size=(行数、列数)
通过设置轴=1
(我希望轴=0
)来执行跨行的求和
这有什么好的理由吗?每次使用它都会让我感到困惑,直到我完全习惯了它。为什么(在我看来!)它与索引数组的标准方式相矛盾,就像代码中带有shape
属性的示例一样
更新
这里还有一些(令人困惑的?)代码,显示了人们可能期望的axis=0
适用于1d数组
>>> 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
>b
数组([1,2,3,2,3,4])
>>>np.和(b,轴=0)
15
>>>np.和(b,轴=1)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
np.和(b,轴=1)
文件“/usr/local/lib/python3.6/site packages/numpy/core/fromneric.py”,第1814行,总计
out=out,**kwargs)
文件“/usr/local/lib/python3.6/site packages/numpy/core/_methods.py”,第32行,共
返回umr_和(a、轴、数据类型、输出、保留)
ValueError:“轴”项超出范围
我认为这是默认值,因为一维数组只能在一个方向上求和。
感谢您在评论中的输入。我认为斯蒂芬关于表现的回答是正确的。Is在numpy中产生了这种小怪癖,这种怪癖已成为常态。数组索引是numpy中常见的混淆源。这篇文章对这个话题进行了精彩的讨论
困惑的根源:
首先要了解的是
索引二维数组有两个相互冲突的约定。
矩阵表示法使用第一个索引指示要选择的行和
指示所选列的第二个索引。这是对的
人们通常认为
第一个索引表示x位置(即列),第二个索引表示y
位置(即世界其他地区)。这本身就是许多混乱的根源;
面向矩阵的用户和面向图像的用户对
关于索引
答案是:
与numpy中的许多其他问题一样,这个问题的答案是:性能:
如果这是真的,为什么不选择呢
符合您最期望的索引顺序?特别是,为什么不定义
按行排序的图像是否使用图像约定?(这有时是指
作为Fortran约定与C约定的对比,因此“C”和“Fortran”
用于以numpy进行数组排序的排序选项。)这样做的缺点是
潜在的性能惩罚。按顺序访问数据是很常见的,
要么隐式地在数组操作中执行,要么显式地在
形象。完成后,将以非最佳顺序访问数据
您认为numpy“reduce”操作的axis
参数,即减少维度数量(通常减少一个维度)的操作是不合逻辑的。您的论点是,给定二维数组,“幸存”维度不是指定的维度。很明显,你使用的短语是summing over
请允许我证明这种批评是站不住脚的。更为一致的概念是沿轴求和,而不是指定幸存轴,而是指定reduce操作消耗的轴
要看到这个,请考虑3d或100d。如果对一堆图像进行平均,则会得到一个平均图像,因此,您将沿过程中消耗的堆叠轴进行平均。根据你的逻辑——你会用幸存轴x和y来指定这个过程——这显然是错误的,比如100d——你必须列举99个幸存轴来描述沿着一个轴的单个减少
如果你对数学感到满意,你也可以很容易地说服自己,积分或求和变量就是后来消失的变量。矩阵乘法:求和维度是结果AB=C->C_jl=sum_k=1^n a_jk b_kl中没有的维度
类似地,将形状(M,N)视为行数、列数在二维中起作用,但在其他任何地方都不起作用。在3d中,它将成为x-y平面的数量,x-z平面的数量,y-z平面的数量,在100d中,x1-x2-x3-…-x99超平面的数量,x0-x2-x3-…-x99超平面的数量。。。最好将(M,N)看作列长度,行长度
我可以这样继续下去,但如果你现在还不相信,那么我不知道有什么可以说服你。几个月前我回答了这个问题。我得查一下。暂时忘记第五行的列名。如果a
是1d,那么a.sum(axis=0)
做什么?使用2d时,哪个扩展是一致的?使用3d?这有帮助吗:;在那里,海报正在尝试理解3d案例中的轴。在某些方面,这比2d的情况更清楚sum(axis=i)
删除ith
维度,并保留其余维度。np.meshgrid`采用索引
参数,允许您在ij
和xy
样式之间进行选择。基本上,它只是切换它返回的I,J
元组的顺序。但在我看来,混淆不同于在函数(如sum
)中涉及axis
参数的混淆。至于性能,在1000x1000阵列上,sum(axis=1)
快1.4倍(与
>>> 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