我有以下 3d numpy 数组 np.random.rand(6602, 3176, 2)
。
我想将它转换为二维数组(numpy
或 pandas.DataFrame
),其中每个值都是一个元组,形状为 (6602 , 3176)
。
This questioned 帮助我了解了如何减小维度,但我仍然在为元组位苦苦挣扎。
最佳答案
这是一个单行代码,需要几秒钟才能解决完整的 (6602, 3176, 2) 问题
a = np.random.rand(6602, 3176, 2)
b = a.view([(f'f{i}',a.dtype) for i in range(a.shape[-1])])[...,0].astype('O')
这里的技巧是将 viewcast 转换为正好跨越一行的复合数据类型。当这样一个复合数据类型被强制转换为对象时,每个复合元素都被转换为一个元组。
更新(帽子提示@hpaulj)有一个库函数可以精确地执行我们手动执行的 View 转换:numpy.lib.recfunctions.unstructured_to_structured
使用它我们可以编写一个更具可读性的版本:
import numpy.lib.recfunctions as nlr
b = nlr.unstructured_to_structured(a).astype('O')
关于python - 将 3d numpy 数组转换为 2d numpy 数组(其中内容是元组),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57955264/