Преобразование временных рядов в матрицу изображений - PullRequest
0 голосов
/ 25 мая 2018

У меня есть массив N временных рядов.Примерно так:

[[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])

должна быть преобразована в 2D-матрицу (например, что-то вроде этого:

[[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 описывает одну серию времени. Для каждой строки в XI требуется двумерная матрица, описывающая временную серию в виде изображения (как график, показанный выше)

«Решение» : Кажется, что нет хорошего решения для этого. Я использовал этот обходной путь сейчас:

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) снова с некоторой потерей качества.

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Взгляните на эти вызов kaggle .Кажется, вы также хотите реализовать части этой статьи так, как они делают.

Может быть, вы также можете использовать функцию, которую они взяли из другого вопроса 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
0 голосов
/ 25 мая 2018

Вы должны написать 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')
...