将时间序列转换为图像矩阵

7

我有一个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 中的每一行都是一个时间序列。 enter image description here 但是我想要一个 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) 再次绘制出来,但是会有一些质量损失。


你需要了解数组的外观以及维度的含义。例如,如果你有一个一维数组或者一个多维数组的行,这个数组是一维的,不能直接绘制成二维图像,需要将其重塑为二维数组。要绘制二维图像,你需要使用二维数据。 - JE_Muc
什么?如果你想单独绘制每一行,那么只有一个1D矩阵。如果你想要一个2D矩阵,你需要重新调整行。没有其他方法可以避免重新调整!但是你不能只是简单地重新调整。你需要提供更多的信息!所需的形状是必须的! - JE_Muc
你需要将数组的一行视为一个线程。你不能将单个线程转换成平面,除非进行变换。在numpy中,这种变换被称为重塑。但是你需要提供关于形状的信息! - JE_Muc
是的,但我只将1D矩阵传递给matplotlib,它也会生成2D矩阵(图像)。它以任何方式为我重新整形。 - L3n95
1
Matplotlib只是使用LineCollection绘制您的数据并在2D中显示它。如果您想要一个表示2D图像中点的矩阵,您需要为每个时间序列定义相同的点间距和轴属性。 - JE_Muc
显示剩余5条评论
2个回答

4

请看这些kaggle挑战。我认为你也想像他们一样实现这篇论文的部分内容。

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

#modified from https://dev59.com/95Dea4cB1Zd3GeqPjPpe
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

1
虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅有链接的答案可能会失效。-【来自审查】 - Gerhard
@GerhardBarnard 感谢您的建议。我添加了相关代码片段。 - Fabian

0

你应该以不同的方式编写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中的第一行描述了第一张绘制的图像,那么我想要的是位于绘图背后的矩阵。因此,描述图像的矩阵。 - L3n95
@Robyn:我点赞了你的回答,因为这是我认为根据L3n95提供的信息绘制数据的唯一方法。但看起来L3n95并不满意,所以将其点踩了。 - JE_Muc
是的,看起来我们在谈论不同的事情。使用matplotlib,我可以绘制每一行数据。因此,matplotlib需要将这个一维数组转换成二维矩阵。而我想要得到的就是这个二维矩阵。我上面描述的X会导致生成多个二维矩阵,而不是一个大的矩阵。 - L3n95

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接