在numpy数组中检查nan值

我已经阅读了一些excel文件的列,并将其存储在一个numpy数组中。 对于我在col中的每个索引,我想检查值是否为nan,如果是nan,我将删除col中和另一个数组x中的索引i。 我做了这个,

workbook = xlrd.open_workbook('well data.xlsx') sheet=workbook.sheet_by_index(0) col= sheet.col_values(1,1) col= np.array (col) col= col.astype(np.float) for i in range (col.shape [0]): if (np.isnan(col[i])): col=np.delete(col,i) x= np.delete(x,i) 

我得到两种types的错误,首先当这个浮点数转换存在col = col.astype(np.float),我得到

  if (np.isnan(col[i])): IndexError: index out of bounds 

第二,如果我删除浮动转换,我得到这个错误,

  if (np.isnan(col[i])): TypeError: Not implemented for this type 

我知道从一个单一的数组中删除南我可以做到这一点,

 x = x[numpy.logical_not(numpy.isnan(x))] 

但是我的情况是不同的,我想从col中删除nan元素,并且在x中删除相应的元素。 例如,如果col中的索引3是nan,则col和x中的索引3应该被删除。 另外,在我的情况下,浮点转换是必要的。

这是一个更详细的例子,

这些是最初的数组(都有相似的长度):

col = [16.5,14.3,17.42,nan,13.22,nan]

x = [1,2,3,4,5,6]

删除nans后,数组应该是,

col = [16.5,14.3,17.42,13.22]

x = [1,2,3,5]

还有一件事,如果我正在读取.dat文件中的列,提供的代码工作得很好,如果我正在阅读excel中的列,那真的很重要吗?

任何人都可以请帮我解决这个问题?

谢谢。

你的第一个想法是正确的。

 col= col.astype(np.float) for i in range (col.shape [0]): if (np.isnan(col[i])): col=np.delete(col,i) x= np.delete(x,i) 

几乎是正确的。 形状返回你的对象的总长度,但你必须从0到这个长度-1。 所以你的线路会是这样的:

 for i in range (0, col.shape [0]): 

但是由于你正在从数组中移除元素,所以在计算这个东西时你可能有一个更小的数组。 所以,如果你想访问第五个也是最后一个元素,你之前删除了一个元素,col将不再有5个元素。 我build议你在你的颜色上像这样向后循环

 for i in range(col.shape [0]-1, -1, -1):