我有一个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数组。
答案 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都不一样(一个相当复杂的结构)。