numpy,命名列

26 投票
2 回答
37494 浏览
提问于 2025-04-16 23:27

关于 numpy 的一个简单问题:

我加载了100个值到一个向量 a 中。现在我想从这个向量创建一个有两列的数组 A,其中一列的名字是 "C1",另一列的名字是 "C2"。第一列的数据类型是 int32,第二列的数据类型是 int64。举个例子:

a = range(100)
A = array(a).reshape( len(a)/2, 2)
# A.dtype = ...?

我在从 a 创建数组的时候,怎么定义列的类型和名字呢?

2 个回答

11

我知道这个问题已经很久了,但现在有一个更新的选择,可以试试 pandas。它的 DataFrame 类型专门用来处理这种结构化的数据,里面的列可以有名字,并且可以是不同的数据类型。

24

NumPy的结构化数组有命名的列:

import numpy as np
    
a = range(100)
A = np.array(list(zip(*[iter(a)] * 2)), dtype=[('C1', 'int32'),('C2', 'int64')])
print(A.dtype)
[('C1', '<i4'), ('C2', '<i8')]

你可以通过名字来访问这些列,方法如下:

print(A['C1'])
# [ 0  2  4  6  8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48
#  50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98]

需要注意的是,使用 np.arrayzip 会让NumPy从一个临时的元组列表中构建数组。相比之下,Python的元组列表占用的内存要比相同的NumPy数组多很多。所以如果你的数组非常大,可能就不太适合使用 zip

相反,如果你有一个NumPy数组 A,你可以使用 ravel()A 转换成一维数组,然后用 view 将它变成结构化数组,最后用 astype 将列转换成你想要的类型:

a = range(100)
A = np.array(a).reshape( len(a)//2, 2)
A = A.ravel().view([('col1','i8'),('col2','i8'),]).astype([('col1','i4'),('col2','i8'),])
print(A[:5])
# array([(0, 1), (2, 3), (4, 5), (6, 7), (8, 9)], 
#       dtype=[('col1', '<i4'), ('col2', '<i8')])

print(A.dtype)
# dtype([('col1', '<i4'), ('col2', '<i8')])

撰写回答