关于 numpy 的简单问题:
我将100个值加载到向量a
中。从这个向量中,我想创建一个带有两列的数组A
,其中一列名称为"C1",类型为int32
,另一列名称为"C2",类型为int64
。 例如:
a = range(100)
A = array(a).reshape( len(a)/2, 2)
# A.dtype = ...?
当我从a
创建数组时,如何定义列的类型和名称?
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.array
和zip
一起会导致NumPy从临时元组列表构建数组。Python中的元组列表比等价的NumPy数组占用更多内存。因此,如果您的数组非常大,则可能不想使用zip
。
相反地,给定一个NumPy数组A
,您可以使用ravel()
将A
转换为1D数组,然后使用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')])
__str__
方法,以带标题的方式漂亮地打印出你的数组。 - Keith