切片一个 numpy 结构化一维​​数组以获取记录的一部分

kri*_*nab 3 python arrays numpy structured-array

我有一个 numpy 一维结构化数组,我只想获取一条记录的一部分。我试图弄清楚如何分割这种类型的请求。这是我的代码:

summary_stat_list = ['mean', 'variance', 'median', 'kurtosis', 'skewness']
model_summary_stats = np.zeros(5,dtype=[('statistic',
                                                       'object'),
                                           ('f1', 'float'),
                                           ('f2', 'float'),
                                           ('f3', 'float'),
                                           ('m1', 'float'),
                                           ('m2', 'float'),
                                           ('m3', 'float'),
                                           ('t3', 'float'),
                                           ('t2', 'float'),
                                           ('t1', 'float'),
                                           ('prom1', 'float'),
                                           ('prom2', 'float')])
for r in range(model_summary_stats.shape[0]):
    model_summary_stats['statistic'][r] = summary_stat_list[r]
Run Code Online (Sandbox Code Playgroud)

现在,该数组如下所示:

[('mean', 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)
('variance', 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)
('median', 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)
('kurtosis', 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)
('skewness', 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)]
Run Code Online (Sandbox Code Playgroud)

我的问题是,除了第一个数组的第一个元素之外,我怎样才能获得所有元素。也就是说,在 'mean' 数组中,我只想获取数字条目。

我正在尝试类似的东西

model_summary_stats[0]['f1':]
Run Code Online (Sandbox Code Playgroud)

或者:

model_summary_stats[0][1:]
Run Code Online (Sandbox Code Playgroud)

但这些都不起作用。有什么建议。

hpa*_*ulj 5

切片不适用于字段名称索引。您必须改用所需字段名称的列表:

model_summary_stats[0][['f1','f2','f3',etc]
Run Code Online (Sandbox Code Playgroud)

您还可以使用类似的内容获得该列表

model_summary_stats.dtype.names[1:]
Run Code Online (Sandbox Code Playgroud)

您应该记住,这种多字段索引的开发很差。可以检索值,但您不能以这种方式设置值。而且您不能跨列进行数学运算。

http://docs.scipy.org/doc/numpy/user/basics.rec.html#accessing-multiple-fields-at-once

不同的 dtype 可能更有用

dt = np.dtype([('statistic',object),('values',(float,11))])
dt = np.dtype([('statistic',object),('values',(float,8)),('prom',(float,3))])
Run Code Online (Sandbox Code Playgroud)

或者在处理数据时最有意义的分组。