打印NumPy数组时的轴顺序

Sel*_*Dot 5 python arrays numpy multidimensional-array python-3.x

我正在NumPy中处理3d数组,我必须大量研究数组元素。说我有阵a哪里a.shape(10,5,3)。我正在使用的是3个形状平面的感觉(10,5),我想这样看。

例如,如果我

print(a)
Run Code Online (Sandbox Code Playgroud)

我懂了

[[[ 0  0  0]
  [ 0  0  0]
  [ 0  0  0]
  [ 0  0  0]
  [ 0  0  0]]

 [[ 0  0  0]
  [ 0 22  0]
  [11 22 33]
  [ 0  0  0]
  [ 0  0  0]]

 [[ 0  0  0]
  [11 22 33]
  [ 0  0  0]
  [11 22 33]
  [ 0  0  0]]

 [[ 0  0  0]
  [11 22 33]
  [ 0  0  0]
  [11 22  0]
  [ 0  0  0]]

 [[ 0  0  0]
  [11 22 33]
  [11  0  0]
  [11 22  0]
  [ 0  0  0]]

 [[ 0  0  0]
  [11 22 33]
  [ 0 22  0]
  [11  0  0]
  [ 0  0  0]]

 [[ 0  0  0]
  [11 22 33]
  [ 0  0  0]
  [11 22  0]
  [ 0  0  0]]

 [[ 0  0  0]
  [11 22 33]
  [ 0  0  0]
  [11 22 33]
  [ 0  0  0]]

 [[ 0  0  0]
  [11 22  0]
  [ 0 22 33]
  [11 22  0]
  [ 0  0  0]]

 [[ 0  0  0]
  [ 0  0  0]
  [ 0  0  0]
  [ 0  0  0]
  [ 0  0  0]]]
Run Code Online (Sandbox Code Playgroud)

而如果我遍历第2轴并像这样打印,它的显示方式将是我想要的:

>>> for i in range(a.shape[2]):
...     print(str(a[:,:,i]) + "\n")
...
[[ 0  0  0  0  0]
 [ 0  0 11  0  0]
 [ 0 11  0 11  0]
 [ 0 11  0 11  0]
 [ 0 11 11 11  0]
 [ 0 11  0 11  0]
 [ 0 11  0 11  0]
 [ 0 11  0 11  0]
 [ 0 11  0 11  0]
 [ 0  0  0  0  0]]

[[ 0  0  0  0  0]
 [ 0 22 22  0  0]
 [ 0 22  0 22  0]
 [ 0 22  0 22  0]
 [ 0 22  0 22  0]
 [ 0 22 22  0  0]
 [ 0 22  0 22  0]
 [ 0 22  0 22  0]
 [ 0 22 22 22  0]
 [ 0  0  0  0  0]]

[[ 0  0  0  0  0]
 [ 0  0 33  0  0]
 [ 0 33  0 33  0]
 [ 0 33  0  0  0]
 [ 0 33  0  0  0]
 [ 0 33  0  0  0]
 [ 0 33  0  0  0]
 [ 0 33  0 33  0]
 [ 0  0 33  0  0]
 [ 0  0  0  0  0]]
Run Code Online (Sandbox Code Playgroud)

在我看来,这更有意义。

因此,似乎我的直觉使轴的可视化方式颠倒了,我的数组a应该是(3,5,10)的形状。但是,我有一个围绕某种格式的数组的整个项目,因此我现在不能真正对其进行更改。我认为轴的顺序是任意的,这就是为什么我对此有所限制。那么,是否有一些我可以让NumPy以反向或任意顺序打印轴的快速甚至内置方式?我查看了文档numpy.set_printoptions,发现没有任何东西。我意识到打印是种琐碎的事情,但是我想绕开为更好地查看数据而必须做的所有切片。也许有人可以解释为什么它不是完全任意的,也许我应该以不同的方式考虑数组轴。

MSe*_*ert 6

不幸的是,这不能通过 NumPys 打印选项中的简单开关来完成。您确实必须重新排序轴以获得所需的输出(这很容易)。

如果只是为了printing,你可以简单地定义一个围绕打印函数的薄包装器:

import numpy as np

def my_numpy_print(arr):
    if arr.ndim == 3:
        print(arr.transpose(2, 0, 1))
    else:  # no idea how you want it to be displayed for different dimensional arrays.
        print(arr)

arr = ...
my_numpy_print(arr)
Run Code Online (Sandbox Code Playgroud)

输出:

[[[ 0 0 0 0 0]
  [ 0 0 11 0 0]
  [ 0 11 0 11 0]
  [ 0 11 0 11 0]
  [ 0 11 11 11 0]
  [ 0 11 0 11 0]
  [ 0 11 0 11 0]
  [ 0 11 0 11 0]
  [ 0 11 0 11 0]
  [0 0 0 0 0]]

 [[0 0 0 0 0]
  [ 0 22 22 0 0]
  [ 0 22 0 22 0]
  [ 0 22 0 22 0]
  [ 0 22 0 22 0]
  [ 0 22 22 0 0]
  [ 0 22 0 22 0]
  [ 0 22 0 22 0]
  [ 0 22 22 22 0]
  [0 0 0 0 0]]

 [[0 0 0 0 0]
  [ 0 0 33 0 0]
  [ 0 33 0 33 0]
  [ 0 33 0 0 0]
  [ 0 33 0 0 0]
  [ 0 33 0 0 0]
  [ 0 33 0 0 0]
  [ 0 33 0 33 0]
  [ 0 0 33 0 0]
  [0 0 0 0 0]]]