我已经从excel文件中读取了一些列并将其存储在numpy数组中。对于col中的每个索引我想检查值是否为nan,如果它是nan,我将删除col中的索引i和另一个数组x中的索引。我这样做了,
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)
我得到两种错误, 首先,当这个浮点转换存在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
我知道要从单个numpy数组中删除nan,我可以这样做,
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读取列,这真的很重要吗?
有人可以帮我解决这个问题吗?
感谢。
答案 0 :(得分:1)
你的第一个想法是正确的。
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)
几乎是正确的。 Shape返回对象的总长度,但必须从0到此长度-1。所以你的for line就像:
for i in range (0, col.shape [0]):
但是既然你要从数组中删除元素,那么在计算这个东西时你可能会有一个更小的数组。因此,如果您想要访问第五个和最后一个元素并且之前删除了一个元素,则col将不再具有5个元素。我建议你在你的coloumn上向后循环,就像这样
for i in range(col.shape [0]-1, -1, -1):