【问题标题】:Converting empty strings to 0 using Numpy使用 Numpy 将空字符串转换为 0
【发布时间】:2013-04-10 21:26:46
【问题描述】:

我有一个 numpy 数组,其中每个元素看起来像这样:

['3' '1' '35' '0' '0' '8.05' '2']
['3' '1' '' '0' '0' '8.4583' '0']
['1' '1' '54' '0' '0' '51.8625' '2']

我想用一些默认值(如 0)替换上面第二行中的所有空字符串。我如何使用 numpy 执行此操作?

最终目标是能够运行这个:S.astype(np.float),但我怀疑空字符串会导致转换出现问题。

【问题讨论】:

  • 所以这些是 numpy 字符串数组?
  • 是的。它是使用np.array 创建的
  • numpy 数组不能与列表推导一起使用吗?

标签: python numpy


【解决方案1】:

先这样做:

s = np.array(['1', '0', ''])
s[s==''] = '0'

s.astype(float)
#array([ 1.,  0.,  0.])

【讨论】:

  • 这比地图快吗?
  • 我很好奇,所以我使用 cProfile 编写了一个玩具示例,它们并不完全相同。我怀疑整体工作大致相同,但调用 map 会创建一个新的浮点值数组,而调用 astype(float) 会保留原始 np.array 并让您将每个值视为浮点数。我现在认为这个答案更好,也更易读,所以我更新了我的答案,这样人们就不会盲目复制不良信息。
【解决方案2】:

这是一种使用 map 的方法,它不会产生与调用 .astype() 相同的数据类型:

def FloatOrZero(value):
    try:
        return float(value)
    except:
        return 0.0


print map(FloatOrZero, ['3', '1', '', '0', '0', '8.4583', '0'])

输出:

[3.0, 1.0, 0.0, 0.0, 0.0, 8.4583, 0.0]

这种方法可能会让您更灵活地清理数据,但如果您想使用 numpy.array,也可能更难推理。

【讨论】:

  • 是地图,减少比@askewchan 的答案更快?
【解决方案3】:

如果你的数组是 t:

t[t=='']='0'

然后转换它。

说明:

t=='' 创建一个与t 具有相同形状的布尔数组,该数组具有 True 值,其中对应的 t 值是一个空格。然后使用这个布尔数组将'0' 分配给原始t 中的适当索引。

【讨论】:

  • 酷,我不记得这个结构了,我正要发布一个带有列表理解的答案,但这很短!
  • @user1778770 仅当您有列表时才使用列表理解。只要你有一个 numpy 数组,你就应该利用它。
  • 我认为您可以通过将链接添加到记录您公开的构造的页面来使您的答案更好。这是为那些想知道发生了什么的初学者准备的。我还没找到
猜你喜欢
  • 1970-01-01
  • 2013-09-27
  • 2018-04-29
  • 2016-03-10
  • 2013-05-05
  • 1970-01-01
  • 2021-04-26
  • 2015-03-28
  • 1970-01-01
相关资源
最近更新 更多