从不同长度的子子列表中查找全局最小值

时间:2013-12-13 22:30:24

标签: python numpy

我有一个由不同长度的子列表组成的列表,其形状如下:

a = [[[-0.152, -0.171, -0.132, -0.111, -0.088],[0.565, 0.718, 0.794, 0.870, 0.947]],[[-0.1293, -0.094, -0.062, -0.030, 3.207, 0.],[1.223, 1.266, 1.309, 0.231, 1.394, 1.434]]]

所以它基本上是一个包含两个子列表AB(可能更多)的主列表,每个子列表都有两个子列表A1A2B1B2(子子列表的数量始终固定为2):

a = [A, B]
A = [A1, A2]
B = [B1, B2]

A1A2的长度为LaB1B2长度为Lb,但这些长度不一定等于,即:La == Lb并非总是如此。

如果有更多类似形状的子列表,我需要获得A1B1之间以及A2B2之间的全局最小值,依此类推。即:如果Ca的{​​{1}}子列表中包含C = [C1, C2] A1, B1, C1,那么我需要A2, B2, C2a之间的全局最小值。< / p>

对于上面的array([-0.171, 0.231]) 列表,输出必须如下所示:

np.min(a, axis=*)

我尝试了La == Lb的几种变体,但我无法让它返回我需要的东西。如果np-min我可以使用B1来获取我需要的结果。例如,如果我从每个子子列表B2La = Lb = 5中移除一个项目以便a = [[[-0.152, -0.171, -0.132, -0.111, -0.088],[0.565, 0.718, 0.794, 0.870, 0.947]],[[-0.1293, -0.094, -0.062, -0.030, 3.207],[1.223, 1.266, 1.309, 0.231, 1.394]]] np.min(np.min(a, axis=2) ,axis=0) array([-0.171, 0.231]) ,那么我可以使用:

{{1}}

4 个答案:

答案 0 :(得分:3)

更改数据结构以使操作更简单,通过numpy数组或Pandas或其他格式,可能是最好的。

但是,一种纯Python的方法是:

map(lambda x: min(map(min, x)), zip(*a))

答案 1 :(得分:1)

尝试使用向量化的np.min转换为np.float的numpy数组:

>>> np.vectorize(np.min)(a)
array([[-0.171 ,  0.565 ],
       [-0.1293,  0.231 ]])

所以你的结果可以用

来实现
>>> np.min(np.vectorize(np.min)(a), axis=0)
array([-0.171, 0.231])

答案 2 :(得分:1)

我可能会选择EMS的解决方案,但这是为您的结构做另外一种方式

[min(reduce(list.__add__, x, [])) for x in zip(*a)]

答案 3 :(得分:1)

我的解决方案,比测试数据发布的其他解决方案略快。有趣的是看到真实数据的速度更快:

[min([item for sublist in x for item in sublist]) for x in zip(*a)]