我有一個描述組態檔的串列,例如下一個:
dat=[(0, 5),(1, 1),(3,1)]
我需要創建該組態檔的離散版本,給出一個時間步“dt=0.2”。例如,“dat”的第一列是:
dt = 0.2
time = np.linspace(dat[0][0],dat[-1][0],int(dat[-1][0]/dt) 1)
我需要分配第二列資料的第二個值,所以新的組態檔將是這樣的:
| 0 | 5 |
| 0.2 | 5 |
| 0.4 | 5 |
| 0.6 | 5 |
| 0.8 | 5 |
| 1 | 5 |
| 1.2 | 1 |
| 1.4 | 1 |
| 1.6 | 1 |
| 1.8 | 1 |
| 2 | 1 |
| 2.2 | 1 |
| 2.4 | 1 |
| 2.6 | 1 |
| 2.8 | 1 |
| 3 | 1 |
我怎樣才能做到這一點?
uj5u.com熱心網友回復:
可能有更好/更清潔/更快的方法,但這就是我想出的:
import numpy as np
dat=[(0, 5),(1, 1),(3,1)]
dt = 0.2
t = [x[0] for x in dat]
col_1 = []
col_2 = []
for idx, (i,j) in enumerate(zip(t[:-1],t[1:])):
N = int((j-i)/dt)
col_1 =np.linspace(i,j,N,endpoint = False).tolist()
col_2 =[dat[idx][1]]*N
res = [(i,j) for i,j in zip(col_1, col_2)] [dat[-1]]
print(res)
結果:
[(0.0, 5), (0.2, 5), (0.4, 5), (0.6000000000000001, 5), (0.8, 5), (1.0, 1), (1.2, 1), (1.4, 1), (1.6, 1), (1.8, 1), (2.0, 1),
(2.2, 1), (2.4000000000000004, 1), (2.6, 1), (2.8, 1), (3, 1)]
uj5u.com熱心網友回復:
您可能想嘗試np.repeat:
dt = 0.2
dat = np.array([(0, 5),(1, 1),(3,1)])
counts = (np.diff(dat[:,0], axis=0)/dt).astype(int)
counts[0] = 1
sum_counts = ((dat[-1,0] - dat[0,0])/dt).astype(int) 1
col_1 = np.linspace(dat[0,0], dat[-1,0], sum_counts)
col_2 = np.repeat(dat[:-1,1], counts)
np.transpose([col_1, col_2])
>>> array([[0. , 5. ],
[0.2, 5. ],
[0.4, 5. ],
[0.6, 5. ],
[0.8, 5. ],
[1. , 5. ],
[1.2, 1. ],
[1.4, 1. ],
[1.6, 1. ],
[1.8, 1. ],
[2. , 1. ],
[2.2, 1. ],
[2.4, 1. ],
[2.6, 1. ],
[2.8, 1. ],
[3. , 1. ]])
uj5u.com熱心網友回復:
這里有一個辦法:你可以先創建一個系列與所需的索引np.linspace,然后用給定的值更新,并與填充剩余價值ffill和bfill:
dat_np = np.array(dat, dtype=float)
s = pd.Series(index=np.arange(dat_np[:,0].min(), dat_np[:,0].max() dt, dt), dtype=float)
s.update(pd.Series(dat_np[:,1], index=dat_np[:,0]))
result = s.ffill()
# this almost works, but we have result[1.0] == 1 instead of result[1.0] == 5;
result.loc[dat_np[:,0]] = np.nan
result = result.ffill().bfill().astype(int)
print(result)
# 0.0 5
# 0.2 5
# 0.4 5
# 0.6 5
# 0.8 5
# 1.0 5
# 1.2 1
# 1.4 1
# 1.6 1
# 1.8 1
# 2.0 1
# 2.2 1
# 2.4 1
# 2.6 1
# 2.8 1
# 3.0 1
# dtype: int64
這假設索引中的所有值都是 的精確倍數dt。
uj5u.com熱心網友回復:
我在等待回應的時候努力了。同樣,我想這應該是一種更好/更清潔/更快的方法。
import numpy as np
dat=[(0, 5),(1, 1),(3,1)]
dt=0.2
col_1 = np.arange(dat[0][0],dat[-1][0] dt,dt)
col_2 = np.zeros(len(col_1))
j=0
for i in range(len(dat)):
while dat[i][0] <= col_1[j] <= dat[i 1][0]:
col_2[j] = dat[i][1]
j = 1
if j == len(col_1):
j = 0
這樣做的結果是
col_1 = array([0. , 0.2, 0.4, 0.6, 0.8, 1. , 1.2, 1.4, 1.6, 1.8, 2. , 2.2, 2.4,
2.6, 2.8, 3. ])
col_2 = array([5., 5., 5., 5., 5., 5., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/391871.html
上一篇:水平分割Python陣列操作
下一篇:如何從陣列的每一列中減去第一列
