今天我正在使用這段代碼來創建一個 numpy recarray。我很確定它可以提高代碼效率。但不完全確定如何。輸入是 t 和 p。每個步驟都說明了多少秒和多少功率。輸出是以秒為單位的重新排列。
## New cycle
import numpy as np
t = np.array([30, 60, 60, 60, 120, 120, 150, 600])
p = np.array([0, 200, 300, 400, 350, 50, 400, 0])
time = np.arange(t.sum())
power = np.ones(len(time))
for i in range(len(t)):
if i ==0:
power[0:t[i]] = p[i]
else:
power[t.cumsum()[i-1] : t.cumsum()[i]] = p[i]
listTuples = [(time[i], power[i]) for i in range(len(time))]
inputArray = np.array(listTuples, dtype=[('time', '<f8'), ('PlossTotal', '<f8')])
uj5u.com熱心網友回復:
我相信最簡單的方法可能是:
zip串列t和p- 使用 python 的串列乘法為每個冪值創建所需長度的串列(例如 [1] * 5 是 [1, 1, 1, 1, 1])
- 將每個串列轉換為 numpy 陣列
- 連接(堆疊)所有陣列
- 如果你需要一個元組陣列,你可以使用
enumerate
代碼:
import numpy as np
t = np.array([30, 60, 60, 60, 120, 120, 150, 600])
p = np.array([0, 200, 300, 400, 350, 50, 400, 0])
res = np.hstack([np.array([ep] * et) for ep, et in zip(p, t)])
res_tuples = = np.array(list(enumerate(res)), dtype=[('time', '<f8'), ('PlossTotal', '<f8')])
uj5u.com熱心網友回復:
你的time和power陣列是:
In [25]: time
Out[25]: array([ 0, 1, 2, ..., 1197, 1198, 1199])
In [26]: power
Out[26]: array([0., 0., 0., ..., 0., 0., 0.])
創建它們的時間:
In [28]: %%timeit
...: for i in range(len(t)):
...: if i ==0:
...: power[0:t[i]] = p[i]
...: else:
...: power[t.cumsum()[i-1] : t.cumsum()[i]] = p[i]
69.2 μs ± 85 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
這是迭代的,所以我懷疑它可以加快速度,但我現在不會詳細介紹。此外,全為零的事實power是可疑的。從元組串列創建陣列的時間要長得多。
In [29]: %%timeit
...: listTuples = [(time[i], power[i]) for i in range(len(time))]
...: inputArray = np.array(listTuples, dtype=[('time', '<f8'), ('PlossTotal'
...: , '<f8')])
668 μs ± 533 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
填充結構化陣列的另一種方法是按欄位分配值。由于欄位數量很少(與記錄數量相比),這通常更快。
In [32]: arr = np.zeros(time.shape, dtype=[('time', '<f8'), ('PlossTotal'
...: ...: , '<f8')])
In [33]: arr['time'] = time
In [34]: arr['PlossTotal'] = power
In [35]: inputArray==arr
Out[35]: array([ True, True, True, ..., True, True, True])
和時間:
In [36]: %%timeit
...: arr = np.zeros(time.shape, dtype=[('time', '<f8'), ('PlossTotal'
...: ...: , '<f8')])
...: arr['time'] = time
...: arr['PlossTotal'] = power
7.53 μs ± 8.59 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)
有了這個時間,現在值得嘗試加快速度power。但由于這些值都是 0,我無法有意義地測驗替代方案。
===
In [38]: %%timeit
...: res = np.hstack([np.array([ep] * et) for ep, et in zip(p, t)])
...: res_tuples =np.array(list(enumerate(res)), dtype=[('time', '<f8'), ('Pl
...: ossTotal', '<f8')])
...:
...:
576 μs ± 474 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/454630.html
