当前位置:   article > 正文

用matplotlib库将形状为(4418,3,150,27,1)的数据进行可视化_typeerror: arrays to stack must be passed as a "se

typeerror: arrays to stack must be passed as a "sequence" type such as list

经检查发现我生成的valjoint数据与作者提供的不同。所以我想可视化看一下究竟是哪里不同。决定用matplotlib库来将valjoint形状为(4418,3,150,27,1)的numpy数据进行可视化。
通过相减我生成的数据与作者提供的数据

diff = val_from_myself - val_from_author

然后可视化出来看一下究竟是哪些数据与作者生成的不同,然后看一下差别有多大。

可视化的操作来源于stack overflow上的https://stackoverflow.com/questions/36410321/matplotlib-how-to-represent-array-as-image

import numpy as np
import matplotlib.pyplot as plt
# 引入包
  • 1
  • 2
  • 3
shape = (4418,3,150,27,1)
  • 1
# diff = val_from_myself - val_from_author
diff = np.random.random_sample(shape)
  • 1
  • 2

先生成一个与我预计展示的diff形状相同的random的array进行测试,

diff[0].shape
  • 1
(3, 150, 27, 1)
  • 1
diff[0]
  • 1
array([[[[0.04071577],
         [0.95986482],
         [0.52586994],
         ...,
         [0.35571531],
         [0.82076305],
         [0.86118058]],

        [[0.22357145],
         [0.71822266],
         [0.27387145],
         ...,
         [0.33893953],
         [0.40765062],
         [0.53080625]],

        [[0.75792293],
         [0.34517699],
         [0.63563691],
         ...,
         [0.05881489],
         [0.57042857],
         [0.16468755]],

        ...,

        [[0.1187414 ],
         [0.89411739],
         [0.3068006 ],
         ...,
         [0.19535109],
         [0.10965052],
         [0.72253673]],

        [[0.43927226],
         [0.96473494],
         [0.15795009],
         ...,
         [0.27780695],
         [0.06872122],
         [0.21858591]],

        [[0.17150297],
         [0.47254316],
         [0.52471497],
         ...,
         [0.79195137],
         [0.06003133],
         [0.22222626]]],
  • 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
  • 45
  • 46
  • 47
  • 48
  • 49


[[[0.4168927 ],
[0.75330351],
[0.03326249],
…,
[0.58373469],
[0.12104278],
[0.76293658]],

        [[0.71412816],
         [0.64042844],
         [0.55803296],
         ...,
         [0.97373851],
         [0.96451841],
         [0.6614665 ]],

        [[0.48990274],
         [0.68564298],
         [0.49324841],
         ...,
         [0.45652626],
         [0.48045541],
         [0.58097244]],

        ...,

        [[0.32700639],
         [0.56813866],
         [0.70563916],
         ...,
         [0.86540404],
         [0.30111993],
         [0.88154087]],

        [[0.3529664 ],
         [0.20931985],
         [0.89013229],
         ...,
         [0.36872604],
         [0.93041892],
         [0.33902597]],

        [[0.73275822],
         [0.39793688],
         [0.19584355],
         ...,
         [0.04259638],
         [0.11689313],
         [0.77362658]]],
  • 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


[[[0.92409916],
[0.00150939],
[0.49043064],
…,
[0.7677901 ],
[0.3357452 ],
[0.91712289]],

        [[0.61773657],
         [0.71698287],
         [0.06918023],
         ...,
         [0.97509528],
         [0.76807735],
         [0.24350673]],

        [[0.35511086],
         [0.1770509 ],
         [0.17058109],
         ...,
         [0.33747421],
         [0.69032098],
         [0.37825793]],

        ...,

        [[0.35713963],
         [0.65227242],
         [0.3922617 ],
         ...,
         [0.18300791],
         [0.76696578],
         [0.98278218]],

        [[0.72316591],
         [0.6511162 ],
         [0.21332253],
         ...,
         [0.84889062],
         [0.89810454],
         [0.76794124]],

        [[0.52053393],
         [0.55935167],
         [0.84717704],
         ...,
         [0.59245906],
         [0.13250955],
         [0.29863322]]]])
  • 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
diff_squ = np.squeeze(diff)
print(diff_squ.shape)
print(diff_squ[0])
print(diff_squ[0].shape)
  • 1
  • 2
  • 3
  • 4
(4418, 3, 150, 27)
[[[0.04071577 0.95986482 0.52586994 ... 0.35571531 0.82076305 0.86118058]
  [0.22357145 0.71822266 0.27387145 ... 0.33893953 0.40765062 0.53080625]
  [0.75792293 0.34517699 0.63563691 ... 0.05881489 0.57042857 0.16468755]
  ...
  [0.1187414  0.89411739 0.3068006  ... 0.19535109 0.10965052 0.72253673]
  [0.43927226 0.96473494 0.15795009 ... 0.27780695 0.06872122 0.21858591]
  [0.17150297 0.47254316 0.52471497 ... 0.79195137 0.06003133 0.22222626]]

 [[0.4168927  0.75330351 0.03326249 ... 0.58373469 0.12104278 0.76293658]
  [0.71412816 0.64042844 0.55803296 ... 0.97373851 0.96451841 0.6614665 ]
  [0.48990274 0.68564298 0.49324841 ... 0.45652626 0.48045541 0.58097244]
  ...
  [0.32700639 0.56813866 0.70563916 ... 0.86540404 0.30111993 0.88154087]
  [0.3529664  0.20931985 0.89013229 ... 0.36872604 0.93041892 0.33902597]
  [0.73275822 0.39793688 0.19584355 ... 0.04259638 0.11689313 0.77362658]]

 [[0.92409916 0.00150939 0.49043064 ... 0.7677901  0.3357452  0.91712289]
  [0.61773657 0.71698287 0.06918023 ... 0.97509528 0.76807735 0.24350673]
  [0.35511086 0.1770509  0.17058109 ... 0.33747421 0.69032098 0.37825793]
  ...
  [0.35713963 0.65227242 0.3922617  ... 0.18300791 0.76696578 0.98278218]
  [0.72316591 0.6511162  0.21332253 ... 0.84889062 0.89810454 0.76794124]
  [0.52053393 0.55935167 0.84717704 ... 0.59245906 0.13250955 0.29863322]]]
(3, 150, 27)
  • 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

现在我要plt.show出一个diff[0][0]的,shape是150*27的长方形的东西

diff_squ[0][0].shape
  • 1
(150, 27)
  • 1
plt.imshow(diff_squ[0][0], cmap='hot')
plt.colorbar()
plt.show()
  • 1
  • 2
  • 3


在这里插入图片描述

好了,现在我需要在纵向维度上连接diff的dim2也就是长度为3的那个维度。平铺展示出来diff[0]的(3, 150, 27)

可以先将问题转化为如何将一个shape为(3,6,2)的矩阵横向拼接为(6,6):

test = np.random.randint(5,size=(3,6,2))
test
  • 1
  • 2
array([[[1, 3],
        [0, 4],
        [1, 3],
        [0, 2],
        [0, 0],
        [3, 1]],

       [[1, 3],
        [1, 0],
        [2, 0],
        [1, 0],
        [1, 2],
        [4, 0]],

       [[4, 3],
        [2, 0],
        [3, 2],
        [0, 0],
        [1, 0],
        [1, 1]]])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

这是我想要的效果:

f = plt.figure()
n=3
for i in range(n):
    # Debug, plot figure
    f.add_subplot(1, n, i + 1)
    plt.imshow(test[i], cmap='hot')
plt.colorbar()
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8


在这里插入图片描述

np.reshape(test,(6,6))
  • 1
array([[1, 3, 0, 4, 1, 3],
       [0, 2, 0, 0, 3, 1],
       [1, 3, 1, 0, 2, 0],
       [1, 0, 1, 2, 4, 0],
       [4, 3, 2, 0, 3, 2],
       [0, 0, 1, 0, 1, 1]])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
plt.imshow(np.reshape(test,(6,6)), cmap='hot')
plt.colorbar()
plt.show()
  • 1
  • 2
  • 3


在这里插入图片描述

如果只是简单的reshape 可以看出numpy是将二维展开然后重新平铺,与我想要的不一样。

所以需要引入numpy的二维拼接中的横向拼接功能,根据文章https://blog.csdn.net/leviopku/article/details/82717355

我可以直到只需要进行水平拼接数组np.hstack就可以了

np.hstack((test[i] for i in range(len(test))))
  • 1
<ipython-input-33-316d9d2c5a32>:1: FutureWarning: arrays to stack must be passed as a "sequence" type such as list or tuple. Support for non-sequence iterables such as generators is deprecated as of NumPy 1.16 and will raise an error in the future.
  np.hstack((test[i] for i in range(len(test))))





array([[1, 3, 1, 3, 4, 3],
       [0, 4, 1, 0, 2, 0],
       [1, 3, 2, 0, 3, 2],
       [0, 2, 1, 0, 0, 0],
       [0, 0, 1, 2, 1, 0],
       [3, 1, 4, 0, 1, 1]])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
test[0]
  • 1
array([[1, 3],
       [0, 4],
       [1, 3],
       [0, 2],
       [0, 0],
       [3, 1]])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
a = test[0]
for i in range(len(test)-1):
    a = np.hstack((a, test[i+1] ))
a
  • 1
  • 2
  • 3
  • 4
0
1





array([[1, 3, 1, 3, 4, 3],
       [0, 4, 1, 0, 2, 0],
       [1, 3, 2, 0, 3, 2],
       [0, 2, 1, 0, 0, 0],
       [0, 0, 1, 2, 1, 0],
       [3, 1, 4, 0, 1, 1]])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

在陈总的帮助下成功了,现在可以比较一下,说明确实是成功进行了拼接:

f = plt.figure()
n=3
for i in range(n):
    # Debug, plot figure
    f.add_subplot(1, n, i + 1)
    plt.imshow(test[i], cmap='hot')
plt.colorbar()
plt.show()

plt.imshow(np.reshape(np.hstack((test[i] for i in range(len(test)))),(6,6)), cmap='hot')
plt.colorbar()
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在这里插入图片描述

<ipython-input-34-43f265a4cc40>:10: FutureWarning: arrays to stack must be passed as a "sequence" type such as list or tuple. Support for non-sequence iterables such as generators is deprecated as of NumPy 1.16 and will raise an error in the future.
  plt.imshow(np.reshape(np.hstack((test[i] for i in range(len(test)))),(6,6)), cmap='hot')
  • 1
  • 2

在这里插入图片描述

好了,现在就差最后一步拼接最外层的维度4418了。可以把问题简化为一个shape为(a,150,27*3)的矩阵如何化为2维的问题

可以将a分为x,y分别为横向和纵向,分别进行拼接。

先将问题简化为a = 64

import math
a = 452
test2 = np.random.randint(100,size=(a,6,6))
x = int(math.sqrt(a))
x
  • 1
  • 2
  • 3
  • 4
  • 5
21
  • 1
y = a / x
y
  • 1
  • 2
21.523809523809526
  • 1

当a=452时,一行可以列21个,然后一共有超过21行。

现在可以拼接了:

x_len = int(math.sqrt(test2))
y_len = a / x
a = test2[0]
for i in len(test2):
    col = int (i/x_len)
    for x in range(x_len):
        a = np.hstack((a, test[i+1] ))
        
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-57-078fb9979486> in <module>
----> 1 x_len = int(math.sqrt(test2))
      2 y_len = a / x
      3 a = test2[0]
      4 for i in len(test2):
      5     col = int (i/x_len)


TypeError: only size-1 arrays can be converted to Python scalars
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

上面用算的再纵横拼接很麻烦,我就没有用了

从https://www.jb51.net/article/188978.htm
中得到灵感,尝试能不能直接把图拼出来,通过plt.subplots

import math
a = 452
test2 = np.random.randint(100,size=(a,3,6,2))
x_len = int(math.sqrt(len(test2)))
y_len = math.ceil( a / x_len )
figsize=(x_len,y_len)
# test2_tran = [np.hstack((test2[i][j] for j in range(test.shape[1]))) for i in range(test.shape[0])
# np.hstack((test[i] for i in range(len(test))))

plt.style.use('seaborn-whitegrid')
fig, ax = plt.subplots(x_len, y_len, figsize=figsize)
fig.subplots_adjust(hspace=0, wspace=0)
print(x_len,y_len)
# try:
for x in range(x_len):
    for y in range(y_len):
        if x * x_len + y == len(test2):
            break
        img = np.hstack((test2[x * x_len + y][j] for j in range(test2.shape[1])))
        ax[x, y].xaxis.set_major_locator(plt.NullLocator())
        ax[x, y].yaxis.set_major_locator(plt.NullLocator())
        ax[x, y].imshow(img, cmap='hot')
    else:
        continue
    break
plt.show()
# except:
#     print('x:',x,' y:',y)
  • 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
21 22


<ipython-input-91-8fccaa6731f0>:19: FutureWarning: arrays to stack must be passed as a "sequence" type such as list or tuple. Support for non-sequence iterables such as generators is deprecated as of NumPy 1.16 and will raise an error in the future.
  img = np.hstack((test2[x * x_len + y][j] for j in range(test2.shape[1])))
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

大功告成

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/518979
推荐阅读
相关标签
  

闽ICP备14008679号