gpt4 book ai didi

python - 在 numpy 数组中查找类型转换失败的索引

转载 作者:行者123 更新时间:2023-11-28 22:19:05 26 4
gpt4 key购买 nike

我有一个一维 numpy 字符串数组,我需要将其转换为新的 dtype。 新类型可以是 int、float 或 datetime 类型。某些字符串可能对该类型无效并且无法转换,这会导致错误,例如:

>>> np.array(['10', '20', 'a'], dtype=int)
...
ValueError: invalid literal for int() with base 10: 'a'

我想找到那个无效值的索引,在这种情况下是2。目前我只能想到两个解决方案,都不是很好:

  1. 使用正则表达式解析异常消息以找到无效值,然后在原始数组中找到该值的索引。这看起来很困惑而且容易出错。
  2. 在 Python 中循环解析值。这可能比 numpy 版本慢得多。例如,这是我做过的一个实验:
from timeit import timeit
import numpy as np

strings = np.array(list(map(str, range(10000000))))


def python_parse(arr):
result = []
for i, x in enumerate(arr):
try:
result.append(int(x))
except ValueError:
raise Exception(f'Failed at: {i}')


print(timeit(lambda: np.array(strings, dtype=int), number=10)) # 35 seconds
print(timeit(lambda: python_parse(strings), number=10)) # 52 seconds

这似乎是一个简单且足够常见的操作,我希望在 numpy 库中内置一个解决方案,但我找不到。

最佳答案

您可以使用 np.core.defchararray.isdigit()找到数字的索引,然后使用逻辑非操作数来获取 nan 数字项的索引。之后,您可以使用 np.where() 获取相应的索引:

In [20]: arr = np.array(['10', '20', 'a', '4', '%'])

In [24]: np.where(~np.core.defchararray.isdigit(arr))
Out[24]: (array([2, 4]),)

如果您想检查多种类型,例如 float,您可以使用自定义函数,然后使用 np.vectorize 将该函数应用于您的数组。对于日期,它有点棘手,但如果您想要一个通用的方法,您可能需要使用 dateutils.parser()

您可以使用如下函数:

# from dateutils import parser
In [33]: def check_type(item):
...: try:
...: float(item)
...: except:
...: try:
...: parser.parse(item)
...: except:
...: return True
...: else:
...: return False
...: else:
...: return False

然后:

vector_func = np.vectorize(check_type)
np.where(vector_func(arr))

演示:

In [45]: arr = np.array(['10.34', '-20', 'a', '4', '%', '2018-5-01'])

In [46]: vector_func = np.vectorize(check_type)
...: np.where(vector_func(arr))
...:
Out[46]: (array([2, 4]),)

关于python - 在 numpy 数组中查找类型转换失败的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50049069/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com