了解numpy格式

时间:2015-09-18 15:04:18

标签: python-3.x numpy

我一直在阅读numpy数组格式documentation,但我无法实现我想要做的事情。

给定一个矩阵数组,其中每列代表不同的字段,我想将每列格式化为整数或双精度,具体取决于该列所代表的数据。

在将此标记为重复之前,请考虑我不想拥有此[(), (), (), ..., ()],我希望这种[[], [], [], ..., []]类型的结构完全一样,但每列的类型不同。

请参阅下面的尝试。

from numpy import array, intc, double

bus_format_str1 = [(" ", intc),
                  ("BUS_TYPE", intc),
                  ("PD", double),
                  ("QD", double),
                  ("GS", double),
                  ("BS", double),
                  ("BUS_AREA", intc),
                  ("VM", double),
                  ("VA", double),
                  ("BASE_KV", double),
                  ("ZONE", intc),
                  ("VMAX", double),
                  ("VMIN", double)]


bus_format_str2 = "|i8, i8, f8, f8, f8, f8, f8, f8, f8, i8, f8, f8"

# original array    
Bus = array([[1, 1, 97.6, 44.2, 0, 0, 2, 1.0393836, -13.536602, 345, 1, 1.06, 0.94],
       [2, 1, 0, 0, 0, 0, 2, 1.0484941, -9.7852666, 345, 1, 1.06, 0.94],
       [3, 1, 322, 2.4, 0, 0, 2, 1.0307077, -12.276384, 345, 1, 1.06, 0.94]])

print(Bus)

# Attempts to apply the format
Bus_format1 = array(Bus, dtype=bus_format_str1)
Bus_format2 = array(Bus, dtype=bus_format_str2)

print(Bus_format1)
print(Bus_format2)

两种格式字符串都会产生与原始字符串无关的结构。

那么,我如何应用每列提到的独立格式?

1 个答案:

答案 0 :(得分:1)

究竟什么是Bus的来源?剪切和粘贴字符串时

In [50]: Bus = array([[1, 1, 97.6, 44.2, 0, 0, 2, 1.0393836, -13.536602, 345, 1, 1.06, 0.94],

... 345,1,1.06,0.94]])

我得到一个所有浮点数的数组:

In [51]: Bus
Out[51]: 
array([[   1.       ,    1.       ,   97.6      ,   44.2      ,
           0.       ,    0.       ,    2.       ,    1.0393836,
         -13.536602 ,  345.       ,    1.       ,    1.06     ,    ....   ]])

Bus_format2 = array(Bus, dtype=bus_format_str2)真的搞砸了事情,在{d}中的字段上复制Bus的每个元素:

array([[(1L, 1L, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1L, 1.0, 1.0),
    (1L, 1L, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1L, 1.0, 1.0),
    ....

注意内部()。你不想要[(), (), (), ..., ()],但你也想要different types per column。你不可能两种方式。如果数组是结构化的,每列的类型不同,numpy将使用[()]表单显示它。 [[]]仅适用于所有类型相同的数组。

您可能需要重新阅读有关dtypes和结构化数组的文档。

但也许您并不关心数据的凹凸表示,而是关注打印样式。但为什么这很重要?您是否正在写入需要特定样式的文件?写作与他人分享,还是出版?

可以使用以下内容构建包含数据和每列不同类型的结构化数组:

从列表列表开始:

In [66]: Bus = [[1, 1, 97.6, 44.2, 0, 0, 2, 1.0393836, -13.536602, 345, 1, 1.06, 0.94],
       [2, 1, 0, 0, 0, 0, 2, 1.0484941, -9.7852666, 345, 1, 1.06, 0.94],
       [3, 1, 322, 2.4, 0, 0, 2, 1.0307077, -12.276384, 345, 1, 1.06, 0.94]]

包含13个字段的dtype(与子列表的长度相匹配)

In [67]: dt='i,i,f,f,i,i,i,f,f,i,i,f,f'

结构化数组输入需要转换为元组:

In [68]: A=np.array([tuple(x) for x in Bus],dtype=dt)

结果并不特别清晰,但那是因为我们有13列,其中一些是浮点数:

In [69]: A
Out[69]: 
array([ (1, 1, 97.5999984741211, 44.20000076293945, 0, 0, 2, 1.0393836498260498, -13.536602020263672, 345, 1, 1.059999942779541, 0.9399999976158142),
       (2, 1, 0.0, 0.0, 0, 0, 2, 1.0484941005706787, -9.785266876220703, 345, 1, 1.059999942779541, 0.9399999976158142),
       (3, 1, 322.0, 2.4000000953674316, 0, 0, 2, 1.0307077169418335, -12.276384353637695, 345, 1, 1.059999942779541, 0.9399999976158142)], 
      dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<f4'), ('f3', '<f4'), ('f4', '<i4'), ('f5', '<i4'), ('f6', '<i4'), ('f7', '<f4'), ('f8', '<f4'), ('f9', '<i4'), ('f10', '<i4'), ('f11', '<f4'), ('f12', '<f4')])

如果要查看dtype以及数据,请使用reprprint(repr(A))。在询问有关结构化数组的问题时,这是一个好主意。