numpy 数组的混合类型列表列表

List of lists of mixed types to numpy array

提问人:atapaka 提问时间:9/20/2023 更新时间:9/20/2023 访问量:30

问:

我有从中导入的数据,它们存储在列表列表中:csv

data=[['1', ' 1.013831', ' 1.713332', ' 1.327002', ' 3.674446', ' 19.995361', ' 09:44:24', ' 2.659884'], ['2', ' 1.013862', ' 1.713164', ' 1.326761', ' 3.662183', ' 19.996973', ' 09:49:27', ' 2.668791'], ['3', ' 1.013817', ' 1.712084', ' 1.326192', ' 3.658077', ' 19.997608', ' 09:54:27', ' 2.671786']]

我想得到一个数组,以便我实际上可以使用适当的切片(我不想要或其他任何东西,只是具有适当数据类型的普通旧数组 - 而不是对象)。numpypandasnumpy

所以我尝试了显而易见的方法:

arr=np.array(data,dtype='i4,f4,f4,f4,f4,f4,U8,f4')

只是为了得到:

ValueError: invalid literal for int() with base 10: ' 1.013831'

这表明将行视为列,将列视为行。该怎么办?我还尝试输入而不是哪个给出和错误,我尝试过:numpydatalist(map(tuple,data))map object is not callable

arr=np.asarray(tuple(map(tuple,data)),dtype='i4,f4,f4,f4,f4,f4,U8,f4')

ValueError: could not assign tuple of length 20 to structure with 8 fields.

请注意,在我的情况下,原始行数是 20。

那么,如何从要指定每个列数据类型的数组中获取数据呢?csvnumpy

python-3.x 列表 numpy

评论

0赞 Suraj Shourie 9/20/2023
您是否尝试过获得转置,然后设置 dtypes?arr.T
0赞 atapaka 9/20/2023
@SurajShourie 你的意思是:?如果是这样,这有同样的问题。我现在很困惑。因为在代码中正确地切片了第一列,因此不应将其转置。也许规格不正确?arr=np.asarray(data); arr2=arr.T; arr3=np.array(arr2,dtype='i4,f4,f4,f4,f4,f4,U8,f4')arr[:,0]dtype
0赞 Suraj Shourie 9/20/2023
NumPy 数组具有单个 dtype。优点是在单个变量中具有混合数据类型。我认为你需要熊猫pd.DataFrame
2赞 Suraj Shourie 9/20/2023
如果你想让它工作,你必须将你的数据结构从列表列表更改为元组列表
3赞 hpaulj 9/20/2023
使用该 dtype,您需要一个包含 8 个元素元组的列表,将数据元组元素与 dtype 术语配对。如果您仍然有 cvs 文本,使用 genfromtxt 加载可能会更容易。

答:

1赞 Quang Hoang 9/20/2023 #1

从文档中的示例来看,这是可行的

np.array(list(map(tuple, data)), dtype='i4,f4,f4,f4,f4,f4,U8,f4')

输出:

array([(1, 1.013831, 1.713332, 1.327002, 3.674446, 19.995361, ' 09:44:2', 2.659884),
       (2, 1.013862, 1.713164, 1.326761, 3.662183, 19.996973, ' 09:49:2', 2.668791),
       (3, 1.013817, 1.712084, 1.326192, 3.658077, 19.997608, ' 09:54:2', 2.671786)],
      dtype=[('f0', '<i4'), ('f1', '<f4'), ('f2', '<f4'), ('f3', '<f4'), ('f4', '<f4'), ('f5', '<f4'), ('f6', '<U8'), ('f7', '<f4')])
f
1

评论

0赞 atapaka 9/20/2023
你是怎么做到的?我正在得到TypeError: 'map' object is not callable
1赞 Suraj Shourie 9/20/2023
您可能使用变量 do 覆盖了函数,然后它应该可以工作mapdel map
0赞 atapaka 9/20/2023
@SurajShourie我不得不完全退出终端并返回,现在它解决了这个问题。
0赞 atapaka 9/21/2023
我已经删除了答案标记,因为上述方法将其转换为一维数组:给出 但是如果我删除该语句,就会生成正确的二维数组。那么如何正确指定多维数组呢?print(arr.shape)(3,)dtypedtype