python – numpy数组的元素智能测试是数字

我有一个数组如下:

In [1]: x = array(['1.2', '2.3', '1.2.3'])

我想测试数组中的每个元素是否可以转换为数值.也就是说,函数:is_numeric(x)将返回一个True / False数组,如下所示:

In [2]: is_numeric(x)
Out[2]: array([True, True, False])

这该怎么做?

最佳答案

import numpy as np

def is_float(val):
        try:
            float(val)
        except ValueError:
            return False
        else:
            return True

a = np.array(['1.2', '2.3', '1.2.3'])

is_numeric_1 = lambda x: map(is_float, x)              # return python list
is_numeric_2 = lambda x: np.array(map(is_float, x))    # return numpy array
is_numeric_3 = np.vectorize(is_float, otypes = [bool]) # return numpy array

取决于数组的大小和返回值的类型,这些函数具有不同的速度.

In [26]: %timeit is_numeric_1(a)
100000 loops, best of 3: 2.34 µs per loop

In [27]: %timeit is_numeric_2(a)
100000 loops, best of 3: 3.13 µs per loop

In [28]: %timeit is_numeric_3(a)
100000 loops, best of 3: 6.7 µs per loop

In [29]: a = np.array(['1.2', '2.3', '1.2.3']*1000)

In [30]: %timeit is_numeric_1(a)
1000 loops, best of 3: 1.53 ms per loop

In [31]: %timeit is_numeric_2(a)
1000 loops, best of 3: 1.6 ms per loop

In [32]: %timeit is_numeric_3(a)
1000 loops, best of 3: 1.58 ms per loop

如果列表没问题,请使用is_numeric_1.

如果你想要一个numpy数组,并且a的大小很小,请使用is_numeric_2.

否则,使用is_numeric_3

点赞