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



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

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之间的全局最小值,依此类推。Ie:如果我在aC = [C1, C2]中有一个额外的C子列表,那么我需要A1, B1, C1A2, B2, C2之间的全局最小值。

在上面的a列表的情况下,输出必须看起来像:

array([-0.171, 0.231])

我已经尝试了np.min(a, axis=*)的几种变体,但我无法让它返回我需要的内容。如果La == Lb,我可以使用np-min来获得我需要的结果。例如,如果我从每个子列表B1B2中删除一个项目,以便La = 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])

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

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

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

我可能会选择EMS的解决方案,但对于您的结构,这里有另一种方法

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

尝试使用矢量化np.min:转换为np.floats的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])

我的解决方案,比其他发布的测试数据稍快。有趣的是,看看什么是真正的数据更快:

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

最新更新