【发布时间】:2015-08-11 08:10:31
【问题描述】:
我有一个存储在列表列表中的值表,例如:
A = [ [a[1],b[1],c[1]],
[a[2],b[2],c[2]],
...
[a[m],b[m],c[m]]]
with
a[i] < b[1]
b[i] < a[i+1]
0 < c[i] < 1
还有一个 numpy 数组,例如:
X = [x[1], x[2], ..., x[n]]
我需要创建一个数组
Y = [y[1], y[2], ..., y[n]]
Y 的每个值对应的位置
for i in [1,2, ..., n]:
for k in [1,2, ..., m]:
if a[k] < x[i] < b[k]:
y[i] = c[k]
else:
y[i] = 1
请注意,X 和 Y 的长度相同,但 A 完全不同。 Y 可以取 A 的第三列中的任何值(c[k] for k= 1,2,... m),只要满足 a[k]
在我正在处理的实际案例中,n = 6789 和 m = 6172。
我可以使用嵌套的“for”循环进行验证,但速度确实很慢。最快的方法是什么?如果 X 和 Y 在 2D numpy 数组中呢?
样本数据:
a = [10, 20, 30, 40, 50, 60, 70, 80, 90]
b = [11, 21, 31, 41, 51, 61, 71, 81, 91]
c = [ 0.917, 0.572, 0.993 , 0.131, 0.44, 0.252 , 0.005, 0.375, 0.341]
A = A = [[d,e,f] for d,e,f in zip(a,b,c)]
X = [1, 4, 10.2, 20.5, 25, 32, 41.3, 50.5, 73]
预期结果:
Y = [1, 1, 0.993, 0.132, 1, 1, 1, 0.375, 1 ]
【问题讨论】:
-
你为什么要
zip([1,2, ..., n],[1,2, ..., m])?这似乎与您想象的不一样。 -
@user2357112:您确实是正确的,我已经更新了问题。谢谢。
-
新版本看起来还是有问题。每个
y[i]值都会被一遍又一遍地覆盖。 -
@jorgehumberto
posted solution对你有用吗? -
@Divakar:完美,谢谢!创建数组需要 3.5 秒(将 X 和 Y 扩展为 2D 数组时),而不是迭代所有元素时需要几分钟。
标签: arrays performance python-2.7 numpy