np.median 不接受某种“关键”参数,并且不返回它找到的索引。此外,当项目数为偶数时(沿轴),它返回 2 个中心项目的平均值。
但是median 用于查找中心项目的np.partition 确实采用结构化数组字段名称。因此,如果我们将元组列表转换为结构化数组,我们可以轻松选择中间项。
名单:
In [1001]: ll
Out[1001]: [('a', 1), ('b', 3), ('c', 5)]
作为结构化数组:
In [1002]: la1 = np.array(ll,dtype='a1,i')
In [1003]: la1
Out[1003]:
array([(b'a', 1), (b'b', 3), (b'c', 5)],
dtype=[('f0', 'S1'), ('f1', '<i4')])
我们可以通过:
In [1115]: np.partition(la1, (1), order='f1')[[1]]
Out[1115]:
array([(b'b', 3)],
dtype=[('f0', 'S1'), ('f1', '<i4')])
并允许偶数个项目(代码抄自np.median):
def mymedian1(arr, field):
# return the middle items of arr, selected by field
sz = arr.shape[0] # 1d for now
if sz % 2 == 0:
ind = ((sz // 2)-1, sz // 2)
else:
ind = ((sz - 1) // 2,)
return np.partition(arr, ind, order=field)[list(ind)]
对于 3 项数组:
In [1123]: mymedian1(la1,'f1')
Out[1123]:
array([(b'b', 3)],
dtype=[('f0', 'S1'), ('f1', '<i4')])
对于 6 项数组:
In [1124]: la2
Out[1124]:
array([(b'a', 1), (b'b', 3), (b'c', 5), (b'd', 22), (b'e', 11), (b'f', 3)],
dtype=[('f0', 'S1'), ('f1', '<i4')])
In [1125]: mymedian1(la2,'f1')
Out[1125]:
array([(b'f', 3), (b'c', 5)],
dtype=[('f0', 'S1'), ('f1', '<i4')])
使用np.argpartition查看我的早期版本的编辑历史记录。
它甚至适用于第一个字段(字符):
In [1132]: mymedian1(la2,'f0')
Out[1132]:
array([(b'c', 5), (b'd', 22)],
dtype=[('f0', 'S1'), ('f1', '<i4')])