用0替换空的numpy字符串

5
我需要翻译的内容如下:

我有一个numpy字符串数组,看起来像这样:

[['0', '', '12.12', '140.65', '', ''],
['3', '', '10.45', '154.45', '', ''],
['5', '', '15.65', '184.74', '', '']]

我需要做的是用数字替换空单元格,以将其转换为浮点数数组。我不能只删除列,因为在某些情况下,空单元格已经填充了。我尝试过这样:

data = np.char.replace(data, '','0').astype(np.float64)

但这只会在所有字符之间放置一个0,最终结果如下所示:

[[0, 0, 1020.0102, 104000.0605, 0, 0],
[30, 0, 1000.0405, 105040.0405, 0, 0],
[50, 0, 1050.0605, 108040.0704, 0, 0]]

我无法理解为什么Python会这样做? 我通过谷歌搜索找不到关于numpy.char.replace的好解释。 有人能向我解释它是如何工作的吗?

3
可能是Numpy数组,填充单个列的空值的重复问题。 - Grzegorz Oledzki
你的“空”单元格包含逗号。Char.replace将正常的字符串替换方法应用于每个元素。 - hpaulj
3个回答

5
>>> a = np.array([['0', '', '12.12', '140.65', '', ''],
... ['3', '', '10.45', '154.45', '', ''],
... ['5', '', '15.65', '184.74', '', '']])
>>> a[a == ''] = 0
>>> a.astype(np.float64)
array([[   0.  ,    0.  ,   12.12,  140.65,    0.  ,    0.  ],
       [   3.  ,    0.  ,   10.45,  154.45,    0.  ,    0.  ],
       [   5.  ,    0.  ,   15.65,  184.74,    0.  ,    0.  ]])

你可能希望在初始数组中包含空字符串,就像 OP 一样。 - lxop
@ixop 这是复制粘贴失败了。给我一秒钟。 - timgeb
1
太好了,这个很有效!感谢您的快速回答! - Toggo
2
@Toggo replace 操作作用于子字符串,因此它会在每个字符串的每个位置上检查要替换的字符串。由于 '' 匹配任何地方,所以你将在每个位置插入 '0'。 - Paul Panzer
@Paul Panzer 好的,我猜到会是这样。有没有可能让替换操作作用于整个字符串而不是子字符串? - Toggo
@Toggo "替换"自己我不这么认为。我认为这个答案是正确的做法。 - Paul Panzer

0

data = np.char.replace(data, '','0')

这段代码似乎是将所有空白位置替换为'0',例如''占用一个位置,而'0'占用两个位置,'12.12'占用六个位置。结果如下:

[['000' '0' '01020.01020' '0104000.06050' '0' '0']
 ['030' '0' '01000.04050' '0105040.04050' '0' '0']
 ['050' '0' '01050.06050' '0108040.07040' '0' '0']]

试试这个:

import numpy as np

a = np.array([['0', '', '12.12', '140.65', '', ''],
              ['3', '', '10.45', '154.45', '', ''],
              ['5', '', '15.65', '184.74', '', '']])

#a[np.where(a == '')] = '0'
a[a == ''] = '0'

a = a.astype(np.float64)

print(a)

0

我知道这是一个老问题,但不幸的是,接受的答案今天不能正常工作。如果你做 [a == ''] 比较,你会得到一个 FutureWarning:

FutureWarning: elementwise comparison failed; returning scalar
instead, but in the future will perform elementwise comparison

一个没有警告可以解决问题的方法是使用numpy.where()

   import numpy as np
   a = np.array([['0', '', '12.12', '140.65', '', ''],
               ['3', '', '10.45', '154.45', '', ''],
               ['5', '', '15.65', '184.74', '', '']])

   result = np.where(a=='', '0', a)
   print(result)

结果是

[['0' '0' '12.12' '140.65' '0' '0']  
 ['3' '0' '10.45' '154.45' '0' '0']  
 ['5' '0' '15.65' '184.74' '0' '0']]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接