我有一个由不同长度的子列表组成的列表,其形状如下:
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
之间的全局最小值,依此类推。即:如果C
中a
的{{1}}子列表中包含C = [C1, C2]
A1, B1, C1
,那么我需要A2, B2, C2
和a
之间的全局最小值。< / p>
对于上面的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])
,那么我可以使用:
{{1}}
答案 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)]