我一直在阅读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)
两种格式字符串都会产生与原始字符串无关的结构。
那么,我如何应用每列提到的独立格式?
答案 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以及数据,请使用repr
:print(repr(A))
。在询问有关结构化数组的问题时,这是一个好主意。