将时间序列转换为图像矩阵
Convert timeseries to image matrix
我有一个时间序列的 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 中的每一行,我需要一个将时间序列描述为图像的二维矩阵(如上图所示)
"Solution":似乎没有很好的解决方案来做到这一点。我现在使用了这个解决方法:
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
现在包含二维矩阵,可以再次使用 plt.imshow(data)
绘制,但质量有所下降。
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')
像他们一样看看这些kaggle challange. It think you also want to implement parts of this paper。
也许你也可以使用他们从另一个 SO 问题中采用的函数:
#modified from
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
我有一个时间序列的 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 中的每一行,我需要一个将时间序列描述为图像的二维矩阵(如上图所示)
"Solution":似乎没有很好的解决方案来做到这一点。我现在使用了这个解决方法:
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
现在包含二维矩阵,可以再次使用 plt.imshow(data)
绘制,但质量有所下降。
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')
像他们一样看看这些kaggle challange. It think you also want to implement parts of this paper。
也许你也可以使用他们从另一个 SO 问题中采用的函数:
#modified from
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