Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 关于轴的Numpy索引逻辑_Python_Arrays_Numpy_Indexing - Fatal编程技术网

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