python - 将文本转换为 numpy 数组

标签 python arrays string numpy exception

我需要一个将(非二进制)字符串作为输入并返回一个 numpy 数组的函数。

Numpy 提供函数 numpy.fromstring ,这适用于所有情况(使用适当的参数):

>>> np.fromstring('1 2 3.1415', dtype=float, sep=' ')
array([ 1.    ,  2.    ,  3.1415])

我的问题是它在太多情况下都有效。例如,在下面的情况下它默默地失败了

>>> np.fromstring('not a string', dtype=float, sep=' ')
array([], dtype=float64)

有没有一种方法可以将非二进制字符串安全地转换为 numpy 数组,如果输入无法转换为数字,该数组会正确抛出错误?

最佳答案

您可以直接使用字符串并使用 np.arraysplit 将其转换回 numpy 数组,如下所示:

>>> np.array('1 2 3.1415'.split(' '), dtype=float)
array([ 1.    ,  2.    ,  3.1415])
>>> np.array('not a string'.split(' '), dtype=float)
ValueError: could not convert string to float: not

当使用 fromstring 时,如果您的输入字符串不仅仅包含实数值数据,您应该期待一个空数组。

>>> np.fromstring('not a string', dtype=float, sep=' ')
array([], dtype=float64)
>>> np.fromstring('not a string 5', dtype=float, sep=' ')
array([], dtype=float64)
>>> np.fromstring('8 5', dtype=float, sep=' ')
array([ 8.,  5.])

编辑: 您可以通过验证您的 input_string 格式来实现您自己的 .fromstring。如果它确实具有您正在寻找的模式(在您的情况下都是 float ),则将其转换为 numpy.array。在失败的情况下,您要么想通过异常错误显式地返回,要么返回一个空列表。

In [1]: import re
In [2]: import numpy as np    
In [3]: def my_fromstring(input_string):
...:     input_string = input_string.strip()
...:     input_string = re.sub(' +', ' ', input_string)
...:     float_pattern = '\d+\.d+|\d+'
...:     verify_fn = lambda s: map(lambda x: re.match(float_pattern, x),           
...:                                    s.split(' '))
...:     pattern_match_fn = lambda x: any(map(lambda x: True if x == None          
...:                                    else False, x))
...:     res = verify_fn(input_string)
...:     match = pattern_match_fn(res)
...:     if not match:
...:         return np.array(map(float, input_string.split(' ')))
...:     else:
...:         raise ValueError('Incorrect input format')
...:     

您现在可以使用您的自定义函数来检查:

In [4]: my_fromstring(' 7 5      8  3  ')
Out[4]: array([ 7.,  5.,  8.,  3.])

In [5]: my_fromstring('not a string')
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-67-88cd38f7ad26> in <module>()
----> 1 my_fromstring('not a string')

<ipython-input-65-e355cf28acb0> in my_fromstring(input_string)
     10         return np.array(map(float, input_string.split(' ')))
     11     else:
---> 12         raise ValueError('Incorrect input format')
     13 

ValueError: Incorrect input format

关于python - 将文本转换为 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45194408/

相关文章:

python - 如何使用 Django ORM 从子查询中进行选择?

python - 图像到文本 - 在 python 2.7 中删除非 ascii 字符

arrays - 如何从 C 语言的输入中读取字符数?

ruby - 检查字符串是否包含来自特定集合的唯一字符

c# - 属性或索引器不能分配给 "--"它是只读的

Python:添加值并写入输出

python - 为什么我的 PanelND 工厂抛出 KeyError?

c++ - 如何将值输入到已经定义的数组中?

php - 如何从数组中提取和删除选定的变量?

java - 重构此 Java 代码以检查 String 是否包含任何这些可能性?