检查 numpy 数组中的 nan 值
Checking nan values in a numpy array
我已经从 excel 文件中读取了一些专栏并将其存储在一个 numpy 数组 col 中。对于 col 中的每个索引 i,我想检查该值是否为 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)
我遇到了两种类型的错误,
首先当这个浮点数转换存在时 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 中读取列真的很重要吗?
谁能帮我解决这个问题?
谢谢。
你的第一个想法是正确的。
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 return 你对象的总长度,但是你必须从 0 到这个长度 -1。所以你的 for 行就像:
for i in range (0, col.shape [0]):
但是由于您要从数组中删除元素,因此在计算这个东西时您可能会得到一个更小的数组。所以如果你想访问第五个也是最后一个元素并且你之前删除了一个元素,col 将不再有 5 个元素。我建议你在你的列上向后循环,像这样
for i in range(col.shape [0]-1, -1, -1):
我已经从 excel 文件中读取了一些专栏并将其存储在一个 numpy 数组 col 中。对于 col 中的每个索引 i,我想检查该值是否为 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)
我遇到了两种类型的错误, 首先当这个浮点数转换存在时 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 中读取列真的很重要吗?
谁能帮我解决这个问题?
谢谢。
你的第一个想法是正确的。
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 return 你对象的总长度,但是你必须从 0 到这个长度 -1。所以你的 for 行就像:
for i in range (0, col.shape [0]):
但是由于您要从数组中删除元素,因此在计算这个东西时您可能会得到一个更小的数组。所以如果你想访问第五个也是最后一个元素并且你之前删除了一个元素,col 将不再有 5 个元素。我建议你在你的列上向后循环,像这样
for i in range(col.shape [0]-1, -1, -1):