NumPy:从记录数组值中获取最小值/最大值

时间:2012-07-04 01:14:41

标签: python numpy

我有一个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:无法使用灵活类型执行reduce

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

3 个答案:

答案 0 :(得分:5)

最简单,最有效的方法可能是将查看您的数组作为simple 2D array of floats

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

是结构化数组上的2D数组视图:

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

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

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

答案 1 :(得分:3)

你可以做到

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

要展开重新排列,然后你可以执行正常的ndarray操作,比如

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

结果

237.0 238.05

基本上ar.dtype.names为您提供了重新排列名称列表,然后从名称和堆栈中逐个检索数组到arnew

答案 2 :(得分:1)

这可能有助于其他人下线,但另一种做法可能更明智:

sort sample.txt | uniq -d

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