如何压缩numpy数组的列表



我有一个numpy数组的dict:

{'data1': array([[0.16461831, 0.82400555],
[0.02958593, 0.483629  ],
[0.51268564, 0.07030046],
[0.17027816, 0.35304705]]),
'data2': array([[0.8292598 , 0.78136548],
[0.30389913, 0.69250432],
[0.66608852, 0.42237639],
[0.72678807, 0.40486951]]),
'data3': array([[0.45614633, 0.96677904],
[0.87066105, 0.75826116],
[0.39431988, 0.73041888],
[0.65685809, 0.65498308]])}

预期输出:

[([0.16461831, 0.82400555], [0.8292598 , 0.78136548], [0.45614633, 0.96677904]), 
([0.02958593, 0.483629 ],  [0.66608852, 0.42237639], [0.87066105, 0.75826116]), 
([0.51268564, 0.07030046], [0.66608852, 0.42237639], [0.39431988, 0.73041888]), 
([0.17027816, 0.35304705], [0.72678807, 0.40486951], [0.65685809, 0.65498308])]

但当我尝试使用zip时:

list(zip(data.values()))

获取此输出:

[(array([[0.16461831, 0.82400555],
[0.02958593, 0.483629  ],
[0.51268564, 0.07030046],
[0.17027816, 0.35304705]]),),
(array([[0.8292598 , 0.78136548],
[0.30389913, 0.69250432],
[0.66608852, 0.42237639],
[0.72678807, 0.40486951]]),),
(array([[0.45614633, 0.96677904],
[0.87066105, 0.75826116],
[0.39431988, 0.73041888],
[0.65685809, 0.65498308]]),)]

如何压缩numpy数组的列表?

如果3D阵列适合您,您可以只在第二轴上使用stack(axis=1(:

np.stack(data.values(), axis=1)
#[[[0.16461831 0.82400555]
#  [0.8292598  0.78136548]
#  [0.45614633 0.96677904]]
# [[0.02958593 0.483629  ]
#  [0.30389913 0.69250432]
#  [0.87066105 0.75826116]]
# [[0.51268564 0.07030046]
#  [0.66608852 0.42237639]
#  [0.39431988 0.73041888]]
# [[0.17027816 0.35304705]
#  [0.72678807 0.40486951]
#  [0.65685809 0.65498308]]]

使用

list(zip(*data.values())

输出:

[(array([0.16461831, 0.82400555]),
array([0.8292598 , 0.78136548]),
array([0.45614633, 0.96677904])),
(array([0.02958593, 0.483629  ]),
array([0.30389913, 0.69250432]),
array([0.87066105, 0.75826116])),
(array([0.51268564, 0.07030046]),
array([0.66608852, 0.42237639]),
array([0.39431988, 0.73041888])),
(array([0.17027816, 0.35304705]),
array([0.72678807, 0.40486951]),
array([0.65685809, 0.65498308]))]

以下代码将创建您的输出:

tmp = [data[d].tolist() for d in data]      
tmp = list(zip(*tmp))

输出:

[([0.16461831, 0.82400555], [0.8292598, 0.78136548], [0.45614633, 0.96677904]), ([0.02958593, 0.483629], [0.30389913, 0.69250432], [0.87066105, 0.75826116]), ([0.51268564, 0.07030046], [0.66608852, 0.42237639], [0.39431988, 0.73041888]), ([0.17027816, 0.35304705], [0.72678807, 0.40486951], [0.65685809, 0.65498308])]

该链接将解释*语法

另一种方式:

[tuple(x) for x in np.stack(data.values(),axis=1).tolist()]
[([0.16461831, 0.82400555], [0.8292598, 0.78136548], [0.45614633, 0.96677904]), 
([0.02958593, 0.483629], [0.30389913, 0.69250432], [0.87066105, 0.75826116]), 
([0.51268564, 0.07030046], [0.66608852, 0.42237639], [0.39431988, 0.73041888]), 
([0.17027816, 0.35304705], [0.72678807, 0.40486951], [0.65685809, 0.65498308])]

最新更新