【问题标题】:delete ndarray numpy row if it has wrong data type如果数据类型错误,则删除 ndarray numpy 行
【发布时间】:2012-12-23 08:52:24
【问题描述】:

我从 CSV 文件加载了这个巨大的 500 万 * 42 ndarray。在我进行一些处理并尝试将其保存到另一个 CSV 文件中,类型为 float

我收到以下错误:

np.savetxt("inputFiles/fixed_X_"+self.file_name, X.astype(np.float), delimiter=",", fmt="%10.0f")
ValueError: could not convert string to float:

我想删除包含此值且无法转换为浮点数的任何行(我相信它是 csv 文件中的空白单元格),但由于文件大小过大,我无法找到它(我甚至不能用excel打开它)。

【问题讨论】:

  • 正确格式化源代码和错误信息并提供完整的回溯
  • 您可能必须使用 csv.writer() 并手动循环遍历数组。
  • 很抱歉做出回答,但还不能发表评论。你不能试试你的代码吗?可能是这样的: try: newcellval = float(oldcellval.get()) except ValueError: # 删除导致麻烦的行返回

标签: python numpy multidimensional-array


【解决方案1】:

Numpy 数组不包含多种数据类型。我假设在这种情况下,您有一个类型为 str 或类型对象的数组。

如果您知道要删除的单元格是空白的,则可以得到一个数组,其中删除了这些行,如下所示:

X[ all(X != '',axis=1) ].astype(float)

本质上,给出 True/False 值列表的索引将为您提供仅包含 True 行的视图。这比实际删除行要快得多。你可以用任何你想要的测试来代替 X != ''。

X !=X = 测试可能是您可以做到这一点的最快方法之一,因为一切都将在 numpy.但是,您可以做的事情是有限的。

如果您真的想检查每个项目是否可以转换为浮点数,以下将起作用:

def canbefloat(x):
    try:
        float(x)
    except:
        return False
    else:
        return True
ucanbefloat = np.frompyfunc( canbefloat, 1, 1 )
X[ all( ucanbefloat(X.astype(object)), axis=1 ).astype(bool) ].astype(float)

然而,这大约慢了三倍。

【讨论】:

  • 谢谢哥们!!第二种方法有效! .. 慢.. 但只会做一次!
猜你喜欢
  • 1970-01-01
  • 2014-06-09
  • 2022-01-18
  • 2019-06-27
  • 1970-01-01
  • 2016-02-05
  • 2022-12-14
  • 2014-02-24
  • 2013-09-22
相关资源
最近更新 更多