二進制數據我有一些數據,看起來像:繪製在python
data = [1,2,4,5,9]
(增加整數隨機模式)
我想繪製它的二進制水平線,從而y = 1,每x值在data
中指定,否則爲零。
我有一些不同的data
陣列,我想棧,類似於這種風格(這是CCD的時鐘數據,但情節格式看起來理想)
我想我需要爲我的數據數組創建一個列表,但是如何爲不在數組中的所有內容指定零值?
謝謝
二進制數據我有一些數據,看起來像:繪製在python
data = [1,2,4,5,9]
(增加整數隨機模式)
我想繪製它的二進制水平線,從而y = 1,每x值在data
中指定,否則爲零。
我有一些不同的data
陣列,我想棧,類似於這種風格(這是CCD的時鐘數據,但情節格式看起來理想)
我想我需要爲我的數據數組創建一個列表,但是如何爲不在數組中的所有內容指定零值?
謝謝
你明白了。您可以在1
的任何位置創建一個列表,並在其他位置指定0
。這可以很容易用一個列表理解
def binary_data(data):
return [1 if x in data else 0 for x in range(data[-1] + 1)]
它會像這樣做:
>>> data = [1, 2, 4, 5, 9]
>>> bindata = binary_data(data)
>>> bindata
[0, 1, 1, 0, 1, 1, 0, 0, 0, 1]
現在,所有你需要做的就是劇情吧...或者更好步它,因爲它的二進制數據和step()
看起來更好的方式:
import numpy as np
from matplotlib.pyplot import step, show
def binary_data(data):
return [1 if x in data else 0 for x in range(data[-1] + 1)]
data = [1, 2, 4, 5, 9]
bindata = binary_data(data)
xaxis = np.arange(0, data[-1] + 1)
yaxis = np.array(bindata)
step(xaxis, yaxis)
show()
要繪製堆疊在同一圖中,你可以調整binary_data()
這樣多個數據數組:
def binary_data(data, yshift=0):
return [yshift+1 if x in data else yshift for x in range(data[-1] + 1)]
所以現在可以設置yshift
參數對y軸移動數據數組。例如,
>>> data = [1, 2, 4, 5, 9]
>>> bindata1 = binary_data(data)
>>> bindata1
[0, 1, 1, 0, 1, 1, 0, 0, 0, 1]
>>> bindata2 = binary_data(data, 2)
>>> bindata2
[2, 3, 3, 2, 3, 3, 2, 2, 2, 3]
比方說,你有data1
,data2
和data3
積疊,你會去這樣的:
import numpy as np
from matplotlib.pyplot import step, show
def binary_data(data, yshift=0):
return [yshift+1 if x in data else yshift for x in range(data[-1] + 1)]
data1 = [1, 2, 4, 5, 9]
bindata1 = binary_data(data1)
x1 = np.arange(0, data1[-1] + 1)
y1 = np.array(bindata1)
data2 = [1, 4, 9]
bindata2 = binary_data(data2, 2)
x2 = np.arange(0, data2[-1] + 1)
y2 = np.array(bindata2)
data3 = [1, 2, 8, 9]
bindata3 = binary_data(data3, 4)
x3 = np.arange(0, data3[-1] + 1)
y3 = np.array(bindata3)
step(x1, y1, x2, y2, x3, y3)
show()
,你可以輕鬆地編輯,使其與任意數據量工作陣列:
data = [ [1, 2, 4, 5, 9],
[1, 4, 9],
[1, 2, 8, 9] ]
for shift, d in enumerate(data):
bindata = binary_data(d, 2 * shift)
x = np.arange(0, d[-1] + 1)
y = np.array(bindata)
step(x, y)
show()
最後,如果你正在處理不同長度的數據陣列(比如[1,2]
和[15,16]
)和你不喜歡的是,在圖的中間消失,您可以再次調整binary_data()
迫使其範圍內的最大範圍圖你的數據。
import numpy as np
from matplotlib.pyplot import step, show
def binary_data(data, limit, yshift=0):
return [yshift+1 if x in data else yshift for x in range(limit)]
data = [ [1, 2, 4, 5, 9, 12, 13, 14],
[1, 4, 10, 11, 20, 21, 22],
[1, 2, 3, 4, 15, 16, 17, 18] ]
# find out the longest data to plot
limit = max([ x[-1] + 1 for x in data])
x = np.arange(0, limit)
for shift, d in enumerate(data):
bindata = binary_data(d, limit, 2 * shift)
y = np.array(bindata)
step(x, y)
show()
編輯:作爲@ImportanceOfBeingErnest建議,如果你喜歡,而無需定義自己的binary_data()
功能進行data
到bindata
轉換,你可以使用numpy.zeros_like()
。只要多加註意,當你將它們堆疊:
import numpy as np
from matplotlib.pyplot import step, show
data = [ [1, 2, 4, 5, 9, 12, 13, 14],
[1, 4, 10, 11, 20, 21, 22],
[1, 2, 3, 4, 15, 16, 17, 18] ]
# find out the longest data to plot
limit = max([ x[-1] + 1 for x in data])
x = np.arange(0, limit)
for shift, d in enumerate(data):
y = np.zeros_like(x)
y[d] = 1
# don't forget to shift
y += 2*shift
step(x, y)
show()
這是完美的太感謝你了! –