【发布时间】:2018-10-26 12:26:36
【问题描述】:
我有一个列表列表(2000x1000),但作为示例考虑这个(10x3):
l = [[8, 7, 6], [5, 3, 1], [4, 5, 9], [1, 5, 1], [3, 5, 7], [8, 2, 5], [1, 9, 2], [8, 7, 6], [9, 9, 9], [4, 5, 9]]
在此示例中,每个列表对应于每个瞬间的 3 个测量值:
t0 -> [8,7,6]
t1 -> [5,3,1]
等等。
我想将测量值与位置的 4 个瞬间窗口进行比较,并取最大值,即峰值到峰值的 99 个百分位数。
示例
让我们考虑第一个窗口:
[8, 7, 6], [5, 3, 1], [4, 5, 9], [1, 5, 1] :
[8,5,4,1] -> peak to peak: 8-1=7
[7,3,5,5] -> ptp=4
[6,1,9,1] -> ptp=8
使用这 3 个值 [7,4,8] 我想取 99percentile 中的最大值,在本例中为 7
对于第二个窗口:
[5, 3, 1], [4, 5, 9], [1, 5, 1], [3, 5, 7]:
[5,4,1,3] -> ptp=4
[3,5,5,5] -> ptp=2
[1,9,1,7] -> ptp=8
最大 99% -> 4
在对所有大小为 4 的窗口执行此操作后,我想用这些值创建一个列表。
我的代码是下面这个,但它很慢。有没有一种快速的方法来实现这一点?
注意:我不能使用 pandas,Numpy 版本应该是
num_meas = 4
m = []
for index, i in enumerate(l):
if index < len(l) - num_meas + 1:
p = []
for j in range(len(i)):
t = []
for k in range(num_meas):
t.append(l[index + k][j])
t = [x for x in t if ~np.isnan(x)]
try:
a = np.ptp(t)
except ValueError:
a = 0
p.append(a)
perce = np.percentile(p, 99)
p = max([el for el in p if el < perce])
m.append(p)
print m
num_meas = 4
m = []
for index, i in enumerate(l):
if index < len(l) - num_meas + 1:
p = []
for j in range(len(i)):
t = []
for k in range(num_meas):
t.append(l[index + k][j])
t = [x for x in t if ~np.isnan(x)]
try:
a = np.ptp(t)
except ValueError:
a = 0
p.append(a)
perce = np.percentile(p, 99)
p = max([el for el in p if el < perce])
m.append(p)
print m
输出:
[7, 4, 7, 6, 5, 7, 7]
【问题讨论】:
-
2000x1000,例子是10x3
-
这是否意味着你可以使用 numpy>1.6 ?
-
不,必须是 1.6 或之前的版本
-
峰到峰的例子有个小错误,[7,3,5,9] -> ptp=6 应该是 [7,3,5,5] -> ptp=4
-
谢谢,你是对的
标签: python python-2.7 list numpy