当前位置: 首页 > 面试题库 >

遍历numpy.array的任意维度

秦才英
2023-03-14
问题内容

是否有函数可以在numpy数组的任意维度上获得迭代器

在第一维上迭代很容易…

In [63]: c = numpy.arange(24).reshape(2,3,4)

In [64]: for r in c :
   ....:     print r
   ....: 
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[[12 13 14 15]
 [16 17 18 19]
 [20 21 22 23]]

但是,要遍历其他维度很难。例如,最后一个维度:

In [73]: for r in c.swapaxes(2,0).swapaxes(1,2) :
   ....:     print r
   ....: 
[[ 0  4  8]
 [12 16 20]]
[[ 1  5  9]
 [13 17 21]]
[[ 2  6 10]
 [14 18 22]]
[[ 3  7 11]
 [15 19 23]]

我正在自己生成一个发生器来执行此操作,但令我惊讶的是,没有像numpy.ndarray.iterdim(axis = 0)这样的函数可以自动执行此操作。


问题答案:

您提出的建议相当快,但是可以通过以下更清晰的形式来提高可读性:

for i in range(c.shape[-1]):
    print c[:,:,i]

或者更好(更快,更通用,更明确):

for i in range(c.shape[-1]):
    print c[...,i]

但是,上述第一种方法的速度似乎是该swapaxes()方法的两倍:

python -m timeit -s 'import numpy; c = numpy.arange(24).reshape(2,3,4)' \
    'for r in c.swapaxes(2,0).swapaxes(1,2): u = r'
100000 loops, best of 3: 3.69 usec per loop

python -m timeit -s 'import numpy; c = numpy.arange(24).reshape(2,3,4)' \
    'for i in range(c.shape[-1]): u = c[:,:,i]'
100000 loops, best of 3: 6.08 usec per loop

python -m timeit -s 'import numpy; c = numpy.arange(24).reshape(2,3,4)' \
    'for r in numpy.rollaxis(c, 2): u = r'
100000 loops, best of 3: 6.46 usec per loop

我猜这是因为swapaxes()不复制任何数据,并且因为处理c[:,:,i] 可能是通过通用代码完成的(该代码处理了:被更复杂的片替换的情况)。

但是请注意,更明确的第二个解决方案c[...,i]既清晰又快速:

python -m timeit -s 'import numpy; c = numpy.arange(24).reshape(2,3,4)' \
    'for i in range(c.shape[-1]): u = c[...,i]'
100000 loops, best of 3: 4.74 usec per loop


 类似资料:
  • 我有一个“连接四块板”,我用一个2d阵列(阵列[x][y]x=x坐标,y=y坐标)模拟它。我必须使用“System.out.println”,所以我必须遍历行。 我需要一种迭代方式[0,0][1,0][2,0][3,0][0,1][1,1][2,1]等 如果我使用正常程序: 它不起作用,因为它以[0,0][0,1][0,2][0,3]等方式进行迭代 正常过程保持在x中并递增y直到列的末尾,但我需要

  • 问题内容: 简而言之:无论地图的类型如何,如何按已排序的键顺序遍历地图? 我发现了一些相关的问题,最接近的问题表明,如果不依靠模块,就不可能做到这一点。这种理解正确吗? 考虑下面的Go代码,该代码以其键的排序顺序遍历两个不同类型的映射: 对于两种不同的地图类型,提取键然后对其进行排序的逻辑是重复的。 有什么方法可以排除这种逻辑并避免重复吗? 我在尝试编写提供方法的接口时遇到了麻烦。特别是,of的返

  • 问题内容: 我创建了一个二维数组,如: 打印此列表将给出输出: 其中每个列表项都是“行,列”格式的字符串 现在给出此列表,我想按顺序迭代它: 依次遍历第一列和第二列,依此类推。我该如何循环? 此问题与纯python列表有关,而标记为相同的问题与numpy数组有关。他们明显不同 问题答案: 使用和。就像是:

  • 问题内容: 我有一个数组: 我想使用一个foreach循环来替换(仅允许我设置数字: 能够显示相关数组值的和类 编辑 我希望将数据回显为: 非常感谢您的快速回复。StackOverflow令人震惊! 问题答案:

  • 问题内容: 我想遍历一个对象,并在每次迭代时将文件路径数组传递给gulp.src,然后对这些文件进行一些处理。下面的代码仅用于说明目的,因为return语句会在第一次通过时终止循环,因此实际上将无法工作。 这是基本思想。有关如何执行此操作的任何想法? 问题答案: 我能够使用合并流实现这一目标。如果有人感兴趣,这里是代码。这个想法是在循环内创建一个流数组,并在完成迭代后合并它们:

  • 本文向大家介绍thinkPHP中多维数组的遍历方法,包括了thinkPHP中多维数组的遍历方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了thinkPHP中多维数组的遍历方法。分享给大家供大家参考,具体如下: 更多关于thinkPHP相关内容可查看本站专题:《ThinkPHP入门教程》及《ThinkPHP常用方法总结》 希望本文所述对大家基于thinkPHP框架的PHP程序设计有所帮助