【发布时间】:2014-02-06 23:58:23
【问题描述】:
注意:我使用的是 Python 和 numpy 数组。
我有很多数组,它们都有两列和多行。第二列中有一些 NaN 值;第一列只有数字。
我想根据第二列按升序对每个数组进行排序,将 NaN 值排除在外。这是一个大数据集,所以我宁愿不必将 NaN 值转换为零或其他东西。
我希望它像这样排序:
105. 4.
22. 10.
104. 26.
...
...
...
53. 520.
745. 902.
184. nan
19. nan
首先我尝试使用 fix_invalid 将 NaN 转换为 1x10^20:
#data.txt has one of the arrays with 2 columns and a bunch of rows.
Data_0_30 = array(genfromtxt(fname='data.txt'))
g = open("iblah.txt", "a") #saves to file
def Sorted_i_M_W(mass):
masked = ma.fix_invalid(mass)
print >> g, array(sorted(masked, key=itemgetter(1)))
Sorted_i_M_W(Data_0_30)
g.close()
或者我用这样的东西替换了这个函数:
def Sorted_i_M_W(mass):
sortedmass = sorted( mass, key=itemgetter(1))
print >> g, array(sortedmass)
每次尝试我都会得到类似的结果:
...
[ 4.46800000e+03 1.61472200e+11]
[ 3.72700000e+03 1.74166300e+11]
[ 4.91800000e+03 1.75502300e+11]
[ 6.43500000e+03 nan]
[ 3.95520000e+04 8.38907500e+09]
[ 3.63750000e+04 1.27625700e+10]
[ 2.08810000e+04 1.28578500e+10]
...
在NaN值的位置,排序重新开始。
(对于fix_invalid,上面摘录中的NaN 显示1.00000000e+20 值)。但我希望排序完全忽略 NaN 值。
按照我想要的方式对该数组进行排序的最简单方法是什么?
【问题讨论】:
-
在对列表的其余部分进行排序之前,您是否尝试过使用
filter()调用来删除带有nan的元素? -
你为什么在 python 中排序而不是使用 numpy?
-
在最新版本的numpy中,函数sort可以按照你所寻求的方式处理nans。这是链接docs.scipy.org/doc/numpy/reference/generated/numpy.sort.html
-
为什么不把 NaN 放在最后呢?我相信这最终不会那么慢得多。但是,如果可以的话,只需使用
numpy函数会快得多。 -
基于@freude 的评论,您可以看到here 对浮点数进行比较的C 函数如何处理这个问题,因为
np.nan != np.nan的计算结果为True,而任何其他涉及@987654337 的比较@返回False。