Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.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函数以在任意轴上操作_Python_Numpy_Multidimensional Array_Indexing - Fatal编程技术网

编写python函数以在任意轴上操作

编写python函数以在任意轴上操作,python,numpy,multidimensional-array,indexing,Python,Numpy,Multidimensional Array,Indexing,长期以来,我一直在以各种各样的方式努力解决这个问题,但从未找到一个好的解决方案 基本上,如果我想写一个函数,在任意秩数组的一个给定但任意的轴上执行一个操作,采用(例如)np.mean(a,axis=some_轴)的风格,我通常不知道如何做 问题似乎总是归结为切片语法的不灵活;如果我想访问第3个索引上的第I个切片,我可以使用[:,:,I],但我不能将其推广到第n个索引。您不能推广它。事实上,在这种情况下,可以查看示例numpy.mean(a,axis=axis\u index)。即使在主要用C编写

长期以来,我一直在以各种各样的方式努力解决这个问题,但从未找到一个好的解决方案

基本上,如果我想写一个函数,在任意秩数组的一个给定但任意的轴上执行一个操作,采用(例如)np.mean(a,axis=some_轴)的风格,我通常不知道如何做


问题似乎总是归结为切片语法的不灵活;如果我想访问第3个索引上的第I个切片,我可以使用[:,:,I],但我不能将其推广到第n个索引。

您不能推广它。事实上,在这种情况下,可以查看示例
numpy.mean(a,axis=axis\u index)
。即使在主要用C编写的numpy中,也会循环通过轴索引来知道在哪里计算平均值。看看
numpy.mean
的核心是什么。即使它们在执行操作之前以有利的方式格式化数据,也始终需要使用
轴索引在所有轴上循环。

numpy
函数使用几种方法来完成此操作:

  • 转置轴以将目标轴移动到已知位置,通常是第一个或最后一个位置;如果需要,将结果转置

  • 重塑(以及转置)以减少问题的更简单维度。如果您的注意力集中在第n个维度上,那么(:n)维度是否平坦可能无关紧要。他们只是在“搭便车”

  • 构造一个索引元组<代码>idx=(切片(无),切片(无),j);[idx]
相当于
A[:,:,j]
。从适当大小的列表或数组开始,用切片填充,摆弄它,然后转换为元组(元组是不可变的)

  • 使用
    索引技巧
    工具构建索引,如
    np.r
    np.s


  • 研究提供轴的代码。编译的
    ufuncs
    不会有帮助,但是像
    tensordot
    沿u轴取u
    沿u轴应用u
    np.cross
    这样的函数是用Python编写的,并且使用了一个或多个技巧。

    扩展@hpaulj的第一个建议,可能出乎意料的是,swapaxes->创建新数组的某些操作->新数组的swapaxes之后的结果通常是连续的,请参见示例