【问题标题】:How to print or display vertically a Python Numpy array/matrix如何垂直打印或显示 Python Numpy 数组/矩阵
【发布时间】:2020-05-07 20:38:46
【问题描述】:

我有一个名为 z 的 Numpy 数组:

pop = np.random.randint(4, size = (3, 3, 1, 5))
z = pop.reshape(tuple(d for d in pop.shape if d > 1))

使用下面的代码,我设法像这样打印它:

for x in z:
   for y in x:
       print(y, end=' ')
   print()

但现在我需要垂直数组的每个单独元素,出于演示目的,如下所示:

感谢您的建议。

【问题讨论】:

  • 在打印之前尝试转置数组,如果你想使用相同的方法:试试z.transpose()。另外,最好是实际粘贴数组而不是截图,这样我们就可以轻松地尝试代码了。
  • 默认numpy显示有什么问题?从长远来看,我认为调整到该显示会更容易,而不是试图提出自己的订单。这种显示的目的是让您对阵列的结构有一个基本的了解(尤其是由形状表示的)。它并不意味着显示一个大数组的所有值。它也不是机器可读的。有更好的方法可以保存数组以供以后使用。
  • @hadik 谢谢,我刚刚发布了数组代码
  • @hpaulj 默认显示没有问题。我正在研究一个模拟模型,对于视觉建议,我需要那种显示风格。
  • "每个元素垂直,每个矩阵/数组作为一个垂直矩阵(列向量)。"令人困惑。原始数组的一个元素是一个数字。在numpy 中,“列向量”是一个 (n,1) 数组。我看不出这如何适用于形状为:(3, 3, 1, 5) 的数组。请记住,当形状为 (3,3) 时看起来不错的布局,当形状为 (10,10) 或更大时可能会过宽。

标签: python arrays numpy matrix


【解决方案1】:
In [277]: pop = np.arange(9*5).reshape(3,3,1,5)                                                        
In [278]: pop                                                                                          
Out[278]: 
array([[[[ 0,  1,  2,  3,  4]],

        [[ 5,  6,  7,  8,  9]],

        [[10, 11, 12, 13, 14]]],


       [[[15, 16, 17, 18, 19]],

        [[20, 21, 22, 23, 24]],

        [[25, 26, 27, 28, 29]]],


       [[[30, 31, 32, 33, 34]],

        [[35, 36, 37, 38, 39]],

        [[40, 41, 42, 43, 44]]]])

交换最后两个轴将给出所需的“列向量”:

In [279]: pop.transpose(0,1,3,2)                                                                       
Out[279]: 
array([[[[ 0],
         [ 1],
         [ 2],
         [ 3],
         [ 4]],

        [[ 5],
         [ 6],
         [ 7],
         [ 8],
         [ 9]],

        [[10],
         [11],
         [12],
         [13],
         [14]]],


       [[[15],
         [16],
         [17],
         [18],
         [19]],

        [[20],
         [21],
         [22],
         [23],
         [24]],

        [[25],
         [26],
         [27],
         [28],
         [29]]],


       [[[30],
         [31],
         [32],
         [33],
         [34]],

        [[35],
         [36],
         [37],
         [38],
         [39]],

        [[40],
         [41],
         [42],
         [43],
         [44]]]])

然后用文字处理块移动,重新排列块。

另一个转置和重塑将以所需的方式对值进行排序,但括号不是您想要的:

In [281]: pop.transpose(0,3,2,1).reshape(3,5,3)                                                        
Out[281]: 
array([[[ 0,  5, 10],
        [ 1,  6, 11],
        [ 2,  7, 12],
        [ 3,  8, 13],
        [ 4,  9, 14]],

       [[15, 20, 25],
        [16, 21, 26],
        [17, 22, 27],
        [18, 23, 28],
        [19, 24, 29]],

       [[30, 35, 40],
        [31, 36, 41],
        [32, 37, 42],
        [33, 38, 43],
        [34, 39, 44]]])

【讨论】:

  • 这样就行了,现在我将尝试在每列之间添加水平空格,以便更好地查看,谢谢!
【解决方案2】:

您可以在打印之前简单地交换您想要的轴:

z = np.swapaxes(z, 1, 0)
for x in z:
   for y in x:
       print(y, end=' ')
   print()

输出:

z = np.arange(45).reshape(3,3,5)

#print(z)
[[[ 0  1  2  3  4]
  [ 5  6  7  8  9]
  [10 11 12 13 14]]

 [[15 16 17 18 19]
  [20 21 22 23 24]
  [25 26 27 28 29]]

 [[30 31 32 33 34]
  [35 36 37 38 39]
  [40 41 42 43 44]]]

#suggested code:
[0 1 2 3 4] [15 16 17 18 19] [30 31 32 33 34] 
[5 6 7 8 9] [20 21 22 23 24] [35 36 37 38 39] 
[10 11 12 13 14] [25 26 27 28 29] [40 41 42 43 44] 

编辑:每次编辑有问题:

z = np.transpose(z,(0,2,1))
for x in z:
  for y in x:
   print(*y, end=' ')
   print()

输出:

0 5 10 
1 6 11 
2 7 12 
3 8 13 
4 9 14 
15 20 25 
16 21 26 
17 22 27 
18 23 28 
19 24 29 
30 35 40 
31 36 41 
32 37 42 
33 38 43 
34 39 44

【讨论】:

  • 可能我解释的不是很好,我需要九个元素中的每一个都在同一位置但垂直方向
  • 我只是添加了一张我需要的新图片
  • @PakinJa 您的打印输出与您的阵列不同。我不确定它代表什么。介意用你想要的相应数组表示来替换它吗?
  • 我只是更改了最后一张图片以避免混淆
  • @PakinJa 感谢您编辑帖子。但是,它仍然令人困惑和不清楚。最好的方法是用您在问题中的示例数组的数字填充点。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 2016-09-02
  • 2016-06-20
  • 1970-01-01
  • 2016-02-03
相关资源
最近更新 更多