用结构化字符串的内容填充结构化数组的更具pythonic风格(更短/更高效)的方法?

用结构化字符串的内容填充结构化数组的更具pythonic风格(更短/更高效)的方法?,python,numpy,structured-array,Python,Numpy,Structured Array,我需要将格式化的字符串放入结构化数组(该字符串是一个JSON格式化的2D表,其中所有列都是对象)。现在,我这样做: import json import numpy json_string = '{"SYM": ["this_string","this_string","this_string"],"DATE": ["NaN","NaN","NaN"],"YEST": ["NaN","NaN","NaN"],"other_DATE": ["NaN","NaN","NaN"],"SIZE": [

我需要将格式化的字符串放入结构化数组(该字符串是一个JSON格式化的2D表,其中所有列都是
对象
)。现在,我这样做:

import json
import numpy
json_string  = '{"SYM": ["this_string","this_string","this_string"],"DATE": ["NaN","NaN","NaN"],"YEST": ["NaN","NaN","NaN"],"other_DATE": ["NaN","NaN","NaN"],"SIZE": ["NaN","NaN","NaN"],"ACTIVITY": ["2019-09-27 14:18:28.000700 UTC","2019-09-27 14:18:28.000700 UTC","2019-09-27 14:18:28.000600 UTC"]}'
all_content  = json.loads(json_string)
dtype        = numpy.dtype(dict(names = list(all_content.keys()), formats = ['O'] * len(all_content.keys())))
this_bucket  = numpy.empty(shape = [len(all_content[next(iter(all_content.keys()))]), ], 
                                dtype = dtype)
for key in all_content.keys():
    this_bucket[key][:] = all_content[key]

但这似乎非常冗长。有直接的方法吗?

设置结构化数组的值基本上有两种方法-一个字段一个字段地赋值(您可以这样做),以及使用元组列表,我将演示这两种方法:

In [180]: all_content                                                           
Out[180]: 
{'SYM': ['this_string', 'this_string', 'this_string'],
 'DATE': ['NaN', 'NaN', 'NaN'],
 'YEST': ['NaN', 'NaN', 'NaN'],
 'other_DATE': ['NaN', 'NaN', 'NaN'],
 'SIZE': ['NaN', 'NaN', 'NaN'],
 'ACTIVITY': ['2019-09-27 14:18:28.000700 UTC',
  '2019-09-27 14:18:28.000700 UTC',
  '2019-09-27 14:18:28.000600 UTC']}
制作对象数据类型数组,主要是为了方便“列”索引

In [181]: arr = np.array(list(all_content.items()))                             
In [182]: arr                                                                   
Out[182]: 
array([['SYM', list(['this_string', 'this_string', 'this_string'])],
       ['DATE', list(['NaN', 'NaN', 'NaN'])],
       ['YEST', list(['NaN', 'NaN', 'NaN'])],
       ['other_DATE', list(['NaN', 'NaN', 'NaN'])],
       ['SIZE', list(['NaN', 'NaN', 'NaN'])],
       ['ACTIVITY',
        list(['2019-09-27 14:18:28.000700 UTC', '2019-09-27 14:18:28.000700 UTC', '2019-09-27 14:18:28.000600 UTC'])]],
      dtype=object)
定义数据类型-如您所做,或使用:

In [183]: dt = np.dtype(list(zip(arr[:,0],['O']*arr.shape[0])))                 
In [184]: dt                                                                    
Out[184]: dtype([('SYM', 'O'), ('DATE', 'O'), ('YEST', 'O'), ('other_DATE', 'O'), ('SIZE', 'O'), ('ACTIVITY', 'O')])
列表“转置”生成元组列表:

In [185]: list(zip(*arr[:,1]))                                                  
Out[185]: 
[('this_string', 'NaN', 'NaN', 'NaN', 'NaN', '2019-09-27 14:18:28.000700 UTC'),
 ('this_string', 'NaN', 'NaN', 'NaN', 'NaN', '2019-09-27 14:18:28.000700 UTC'),
 ('this_string', 'NaN', 'NaN', 'NaN', 'NaN', '2019-09-27 14:18:28.000600 UTC')]
此列表适合作为数据输入:

In [186]: np.array(list(zip(*arr[:,1])),dtype=dt)                               
Out[186]: 
array([('this_string', 'NaN', 'NaN', 'NaN', 'NaN', '2019-09-27 14:18:28.000700 UTC'),
       ('this_string', 'NaN', 'NaN', 'NaN', 'NaN', '2019-09-27 14:18:28.000700 UTC'),
       ('this_string', 'NaN', 'NaN', 'NaN', 'NaN', '2019-09-27 14:18:28.000600 UTC')],
      dtype=[('SYM', 'O'), ('DATE', 'O'), ('YEST', 'O'), ('other_DATE', 'O'), ('SIZE', 'O'), ('ACTIVITY', 'O')])

您可以通过以下方式简化获取键/字段的数量:

In [187]: len(all_content)                                                      
Out[187]: 6
获取“记录”数量的另一种方法是

In [188]: first,*rest=all_content.values()                                      
In [189]: first                                                                 
Out[189]: ['this_string', 'this_string', 'this_string']

您的<代码>下一步(ITER…)/代码>可能是好的。

您可以考虑使用,它使用诸如JSON数据的内置方法和加载JSON数据。在这种情况下,我不想使用熊猫。我需要把一切都弄清楚。我觉得很不错。由于源代码是一本字典,您必须反复阅读这些键。非常感谢您,我将花费一些时间详细阅读您的答案,但我已经非常感谢您为编写它所付出的努力。