我有一个由不同长度的子列表组成的列表,形状如下:
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]]]
所以它基本上是一个主列表,有两个子列表A
和B
(可能更多),每个子列表都有两个子表A1
、A2
和B1
、B2
(子列表的数量总是固定为2):
a = [A, B]
A = [A1, A2]
B = [B1, B2]
A1
、A2
具有相等的长度La
,B1
、B2
具有长度Lb
也是如此,但这些长度不一定相等,即:La == Lb
并不总是真的。
如果有更多类似形状的子列表,我需要获得A1
和B1
之间以及A2
和B2
之间的全局最小值,依此类推。Ie:如果我在a
和C = [C1, C2]
中有一个额外的C
子列表,那么我需要A1, B1, C1
和A2, B2, C2
之间的全局最小值。
在上面的a
列表的情况下,输出必须看起来像:
array([-0.171, 0.231])
我已经尝试了np.min(a, axis=*)
的几种变体,但我无法让它返回我需要的内容。如果La == Lb
,我可以使用np-min
来获得我需要的结果。例如,如果我从每个子列表B1
和B2
中删除一个项目,以便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.float
s的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)]