如何将特定列作为特定类型加载numpy数组

2024-10-03 13:27:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试了以下几点:

>>> arr2 = [[0, 0, 0, -0.9, 0.3], [0, 0, 1, 0.9, 0.6], [0, 1, 0, -0.2, 0.6], [0, 1, 1, 0.8, 0.3], [1, 0, 1, 0.2, 1.0], [1, 1, 0, -0.8, 1.0]]
>>> narr2 = np.array(arr2)
>>> narr2
array([[ 0. ,  0. ,  0. , -0.9,  0.3],
       [ 0. ,  0. ,  1. ,  0.9,  0.6],
       [ 0. ,  1. ,  0. , -0.2,  0.6],
       [ 0. ,  1. ,  1. ,  0.8,  0.3],
       [ 1. ,  0. ,  1. ,  0.2,  1. ],
       [ 1. ,  1. ,  0. , -0.8,  1. ]])

如何使前三列的类型为int?这就是我如何获得以下信息:

>>> narr2
array([[ 0 ,  0 ,  0 , -0.9,  0.3],
       [ 0 ,  0 ,  1 ,  0.9,  0.6],
       [ 0 ,  1 ,  0 , -0.2,  0.6],
       [ 0 ,  1 ,  1 ,  0.8,  0.3],
       [ 1 ,  0 ,  1 ,  0.2,  1. ],
       [ 1 ,  1 ,  0 , -0.8,  1. ]])

我尝试了以下几点:

>>> narr2 = np.array(arr2,dtype='i4,i4,i4,f8,f8')
>>> narr2
array([[(0, 0, 0,  0. ,  0. ), (0, 0, 0,  0. ,  0. ),
        (0, 0, 0,  0. ,  0. ), (0, 0, 0, -0.9, -0.9),
        (0, 0, 0,  0.3,  0.3)],
       [(0, 0, 0,  0. ,  0. ), (0, 0, 0,  0. ,  0. ),
        (1, 1, 1,  1. ,  1. ), (0, 0, 0,  0.9,  0.9),
        (0, 0, 0,  0.6,  0.6)],
       [(0, 0, 0,  0. ,  0. ), (1, 1, 1,  1. ,  1. ),
        (0, 0, 0,  0. ,  0. ), (0, 0, 0, -0.2, -0.2),
        (0, 0, 0,  0.6,  0.6)],
       [(0, 0, 0,  0. ,  0. ), (1, 1, 1,  1. ,  1. ),
        (1, 1, 1,  1. ,  1. ), (0, 0, 0,  0.8,  0.8),
        (0, 0, 0,  0.3,  0.3)],
       [(1, 1, 1,  1. ,  1. ), (0, 0, 0,  0. ,  0. ),
        (1, 1, 1,  1. ,  1. ), (0, 0, 0,  0.2,  0.2),
        (1, 1, 1,  1. ,  1. )],
       [(1, 1, 1,  1. ,  1. ), (1, 1, 1,  1. ,  1. ),
        (0, 0, 0,  0. ,  0. ), (0, 0, 0, -0.8, -0.8),
        (1, 1, 1,  1. ,  1. )]],
      dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4'), ('f3', '<f8'), ('f4', '<f8')])

可以看出,我没有得到期望的输出。似乎我不明白在创建数组时如何指定类型以及哪里出错


Tags: 信息类型nparrayintf2f1dtype
2条回答
In [1]: arr2 = [[0, 0, 0, -0.9, 0.3], [0, 0, 1, 0.9, 0.6], [0, 1, 0, -0.2, 0.6],
   ...:  [0, 1, 1, 0.8, 0.3], [1, 0, 1, 0.2, 1.0], [1, 1, 0, -0.8, 1.0]]
   ...: narr2 = np.array(arr2)
In [2]: dt=np.dtype('i4,i4,i4,f8,f8')

使用元组列表:

In [3]: np.array([tuple(l) for l in arr2], dtype=dt)
Out[3]: 
array([(0, 0, 0, -0.9, 0.3), (0, 0, 1,  0.9, 0.6), (0, 1, 0, -0.2, 0.6),
       (0, 1, 1,  0.8, 0.3), (1, 0, 1,  0.2, 1. ), (1, 1, 0, -0.8, 1. )],
      dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4'), ('f3', '<f8'), ('f4', '<f8')])

或者使用recfunctions实用程序:

In [5]: import numpy.lib.recfunctions as rf
In [6]: rf.unstructured_to_structured(narr2, dt)
Out[6]: 
array([(0, 0, 0, -0.9, 0.3), (0, 0, 1,  0.9, 0.6), (0, 1, 0, -0.2, 0.6),
       (0, 1, 1,  0.8, 0.3), (1, 0, 1,  0.2, 1. ), (1, 1, 0, -0.8, 1. )],
      dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4'), ('f3', '<f8'), ('f4', '<f8')])

我建议您将列表转换为元组,然后分配数据类型。以下是我的解决方案:

import numpy as np

arr2 = [[0, 0, 0, -0.9, 0.3], [0, 0, 1, 0.9, 0.6], 
[0, 1, 0, -0.2, 0.6], [0, 1, 1, 0.8, 0.3], [1, 0, 1, 0.2, 1.0], [1, 1, 0, -0.8, 1.0]]

tupp2 = [tuple(l) for l in arr2]

datatype = [('A', np.int), ('B', np.int), ('C', np.int), ('D', np.float), ('E', np.float)]
narr2 = np.array(tupp2, dtype=datatype)

检查每列的数据类型:

for i in narr2[0]:
    print(i.dtype)

给出:

int32
int32
int32
float64
float64

相关问题 更多 >