【问题标题】:Huge Numpy list - How to get n digit?巨大的 Numpy 列表 - 如何获得 n 位?
【发布时间】:2020-11-09 17:25:03
【问题描述】:

目前我有一个庞大的 numpy 随机生成数字数据库。

array([62051180209, 87882444506, 49821030805, ..., 54840854303,
       21222836608, 24070750502])

现在我想检查前任有多少号码。数字 05,位置 3 和 4 上的 15 位数字。(例如 62-05-1180209,就像我列表中的第一个)

我想检查有多少 numberx 在其他位置有其他数字。像第 5、6 位一样。例如,我列表中的第 1 位有 11 号。

【问题讨论】:

  • 是否将所有内容都转换为字符串需要太长时间,而您正在寻找更快的解决方案,或者您说您根本不知道如何做到这一点?
  • 老实说,我是 python 新手。所以目前不知道如何做到这一点。我想也许有一个命令可以做到这一点,但我正在搜索,但我没有找到任何东西。
  • 尝试将数字转换为字符串,然后通过索引获取数字并检查 for 循环。

标签: python digits


【解决方案1】:

对字符串的操作比整数占用更多的 CPU 和 RAM。改用整数数学要快得多:

def get_matches(array, start, end, value): 
    return np.remainder(array // 10**start, 10**(end-start)) == value

解释:

  • array // 10**start 在末尾删除 start 数字,使用整数除法
  • np.remainder 删除除 end-start 尾随数字以外的所有内容
  • == value 检查值是否匹配。请注意,要检查两位数是否为 05,值应仅为 5。

【讨论】:

  • 唯一的问题是这会向后而不是向前,所以startend 从最不重要的数字而不是最重要的数字开始计数。否则,比转换为字符串并在 numpy 数组上迭代要好得多。
  • @PranavHosangadi 是的。考虑到生成数字的长度,反转这个逻辑也很简单
  • 当数字并非都具有相同的长度时,可能不是那么简单,但仍然可行。
  • @PranavHosangadi 在一般情况下,这是真的。在这里,我们正在处理一个随机数生成器,它预计会产生一个已知范围内的数字,它定义了最大长度
【解决方案2】:

正如 Random Davis 已经建议的那样,这可能有效:

import numpy as np
mylist = np.array([62011180209, 87882444506, 49821030805, 54840854303,21222836608, 24070750502])

def get_matches(mylist, start, end, value):
    value = str(value)
    return [str(i)[start:end+1]==value  for i in mylist]

get_matches(mylist, start=3, end=4, value=11)

对于该列表,这将提供以下结果:

[True, False, False, False, False, False]

如果要考虑多个选择,那么用一种朴素的方法,上面的函数可以重写如下:

def get_matches_multichoice(mylist, start, end, valuelist):
    valuelist = [str(value) for value in valuelist]
    return [str(i)[start:end+1] in valuelist  for i in mylist]

调用是针对上述数据示例:

print (get_matches_multichoice(mylist, start=3, end=5, valuelist=np.array([111, 824, 408])) )

然后返回:

[True, True, False, True, False, False]

【讨论】:

  • 这显然是最简单的方法。正如 Marat 所讨论的,有一个非常优雅的解决方案,它使用原始数值。对上面的示例数组使用 %timeit 单元魔法,纯数字方法得到 4.29 µs,而字符串转换方法得到 4.83 µs。
  • 是否可以同时检查多个值?例如,我想检查位置 10 上的数字是否等于 0 或 2 或 4 或 6 或 8? get_matches(mylist, start=10, end=10, value=?).count(True)。计数适用于单个值。我尝试输入不同的值,例如 (0,2...) 或 [0,2] 但它不起作用。
  • 是的。通过将value = str(value) 替换为valuelist = [str(value) for value in valuelist],函数应返回以下内容:return [str(i)[start:end+1] in valuelist for i in mylist]
  • valuelist 应该是您想要的可能性的列表或数组,例如在您的示例中 [0,2,4,6,8]。其余的函数参数应该是一样的。
  • 是的!它有效,非常感谢你! :) 如果我可以问。有没有一种简单的方法可以使用变量存储这个数字或被计为 True 的值?
猜你喜欢
  • 2013-06-17
  • 2019-01-15
  • 2018-11-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-15
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
相关资源
最近更新 更多