numpy,命名列

Jak*_* M. 17 python numpy

关于numpy的简单问题:

我将100个值加载到矢量a.从这个向量,我想创建一个A包含2列的数组,其中一列具有名称"C1",第二列具有"C2",一列具有类型int32,另一列具有类型int64.一个例子:

a = range(100)
A = array(a).reshape( len(a)/2, 2)
# A.dtype = ...?
Run Code Online (Sandbox Code Playgroud)

当我从中创建数组时,如何定义列的类型和名称a

unu*_*tbu 13

Numpy结构化数组具有命名列:

import numpy as np

a=range(100)
A = np.array(zip(*[iter(a)]*2),dtype=[('C1','int32'),('C2','int64')])
print(A.dtype)
# [('C1', '<i4'), ('C2', '<i8')]
Run Code Online (Sandbox Code Playgroud)

您可以按名称访问列,如下所示:

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]
Run Code Online (Sandbox Code Playgroud)

请注意,使用np.arraywith zip会导致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')])
Run Code Online (Sandbox Code Playgroud)


use*_*107 9

我知道这是一个老问题,但最近可用的选项是尝试使用熊猫.的数据帧类型被设计为这样的结构化数据,其中列被命名,并且可以是不同的类型.