【问题标题】:Convert timeseries to image matrix将时间序列转换为图像矩阵
【发布时间】: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


【解决方案1】:

看看这些kaggle challange。它认为您还想像他们一样实现this paper 的部分内容。

也许您也可以使用他们从另一个 SO 问题中采用的功能:

#modified from https://stackoverflow.com/questions/33650371/recurrence-plot-in-python
def recurrence_plot(s, eps=None, steps=None):
    if eps==None: eps=0.1
    if steps==None: steps=10
    d = sk.metrics.pairwise.pairwise_distances(s)
    d = np.floor(d / eps)
    d[d > steps] = steps
    #Z = squareform(d)
    return d

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
  • @GerhardBarnard 感谢您的建议。我添加了相关的代码片段
【解决方案2】:

你应该用不同的方式写 X:

import numpy as np
X = np.array([[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]])

它将为您提供正确的值。那么对于灰度图:

plt.figure()
plt.imshow(X, cmap = 'gray')

【讨论】:

  • 不,这不是我需要的。 X 中的每一行都描述了一个时间序列,并且 X 中的每一行都应转换为图像。如果我们说 X 中的第一行描述了第一个绘制的图像,我想要位于图后面的矩阵。所以描述图像的矩阵。
  • @Robyn:我赞成你的回答,因为恕我直言,这是使用 L3n95 提供的信息绘制数据的唯一方法。但看起来 L3n95 不满意并投了反对票。
  • 是的,我们似乎在谈论不同的事情。使用 matplotlib 我可以绘制每一行。所以 matplotlib 需要将 1D 行转换为 2D 矩阵。我想要这个二维矩阵。我上面描述的 X 会产生几个二维矩阵,而不是一个大矩阵。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多