3

我有一个浮点数的 NumPy 记录数组:

import numpy as np
ar = np.array([(238.03, 238.0, 237.0),
               (238.02, 238.0, 237.01),
               (238.05, 238.01, 237.0)], 
              dtype=[('A', 'f'), ('B', 'f'), ('C', 'f')])

如何从此记录数组中确定最小值/最大值?我通常的尝试ar.min()失败了:

TypeError:无法使用灵活类型执行归约

我不确定如何将值展平为更简单的 NumPy 数组。

4

3 回答 3

5

最简单和最有效的方法可能是将的数组视为一个简单的 2D 浮点数组

ar_view = ar.view((ar.dtype[0], len(ar.dtype.names)))

这是结构化数组的二维数组视图:

print ar_view.min(axis=0)  # Or whatever…

这种方法很快,因为没有创建新数组(更改会ar_view导致更改ar)。但是,它仅限于像您这样的情况,其中所有记录字段都具有相同的类型(此处为 float32)。

一个优点是这种方法保持原始数组的 2D 结构完整:例如,您可以在每个“列” ( axis=0) 中找到最小值。

于 2012-07-04T05:58:16.360 回答
3

你可以做

# construct flattened ndarray
arnew = np.hstack(ar[r] for r in ar.dtype.names)

展平recarray,然后您可以执行正常的ndarray操作,例如

armin, armax = np.min(arnew), np.max(arnew)
print(armin),
print(armax)

结果是

237.0 238.05

基本上ar.dtype.names给你recarray名称的列表,然后你从名称和堆栈中一一检索数组到arnew

于 2012-07-04T01:26:54.897 回答
1

这可能会帮助其他人,但另一种方法可能更明智:

import numpy as np
ar = np.array([(238.03, 238.0, 237.0),
              (238.02, 238.0, 237.01),
              (238.05, 238.01, 237.0)], 
              dtype=[('A', 'f'), ('B', 'f'), ('C', 'f')])
arView = ar.view(np.recarray)
arView.A.min()

这让我可以挑选。我的一个问题是我所有元素的 dtype 都不相同(总的来说是一个相当复杂的结构)。

于 2015-06-02T03:22:40.680 回答