【发布时间】:2018-11-04 15:59:36
【问题描述】:
我有一个 numpy 数组 X 的时间序列。类似的东西:
[[0.05, -0.021, 0.003, 0.025, -0.001, -0.023, 0.095, 0.001, -0.018]
[0.015, 0.011, -0.032, -0.044, -0.002, 0.032, -0.051, -0.03, -0.020]
[0.04, 0.081, -0.02, 0.014, 0.063, -0.077, 0.059, 0.031, 0.025]]
我可以用这个来绘制
fig, axes = plt.subplots(3, 1)
for i in range(3):
axes[i].plot(X[i])
plt.show()
然后出现类似以下的内容(这些图确实不显示我在上面写的演示值,但其他具有类似结构的值)。所以 X 中的每一行都是一个时间序列。
但我想要一个 numpy 数组,将每个时间序列描述为灰度图像(因为我想稍后将它用于 cnn)。所以我认为我需要的应该是这样的:
[[[0, 0, 0, 0, 0, 1]
[0, 0, 0, 0, 1, 0]
[0, 0, 0, 0, 0, 1]
[0, 0, 1, 0, 0, 0]]
[[0, 0, 1, 0, 0, 0]
[0, 0, 0, 1, 0, 0]
[0, 1, 0, 0, 0, 0]
[0, 1, 0, 0, 0, 0]]...]
如何(如果可能:高效)将每个时间序列转换为矩阵,将时间序列描述为图像。所以旧数组中的每一行(例如:
[0.05, -0.021, 0.003, 0.025, -0.001, -0.023, 0.095, 0.001, -0.018])
应该转换为二维矩阵(例如:
[[0, 0, 0, 0, 0, 1]
[0, 0, 0, 0, 1, 0]
[0, 0, 0, 0, 0, 1]
[0, 0, 1, 0, 0, 0]]
替代描述: X 中的每一行描述一个时间序列。对于 X 中的每一行,我需要一个将时间序列描述为图像的二维矩阵(如上图所示)
“解决方案”:似乎没有很好的解决方案可以做到这一点。我现在使用了这个解决方法:
fig = plt.figure()
fig.add_subplot(111)
fig.tight_layout(pad=0)
plt.axis('off')
plt.plot(X[0], linewidth=3)
fig.canvas.draw()
data = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep='')
data = data.reshape(fig.canvas.get_width_height()[::-1] + (3,))
data 现在包含 2D 矩阵,可以再次使用plt.imshow(data) 绘制,但质量会有所下降。
【问题讨论】:
-
你想怎么做?如果不对其进行整形,则无法将行绘制为图像。而且您没有提供有关如何重塑行的任何信息。您需要向我们提供更多信息。
-
可以绘制行。使用 z = np.array([0.05, -0.022, 0.03,...]) plt.plot(z) 我得到的图看起来像上面显示的图。所以 matplotlib 也以任何方式进行这种转换。
-
您需要了解数组是什么样子以及维度的含义是什么。例如,如果您有一个一维数组或一行多维数组,则 不能 将其绘制为 2D 图像而不将其重新整形为 2D,因为它是 one维度。要绘制 2D 图像,您需要两个传递 二维 数据。
-
是的,这正是我想要的。描述 2D 图像的矩阵。我可以绘制每一行,将其导出为 png 并再次导入以使矩阵描述图像。我希望有一个更简单的方法。
-
Matplotlib 只是使用
LineCollection绘制您的数据并以 2D 形式显示。如果你想让一个矩阵将 2D 图像中的点表示为一个矩阵,你需要为每个时间序列定义相同的点间距和轴属性。
标签: python numpy matplotlib numpy-ndarray