巨大的 Numpy 列表 - 如何获得 n 位数字?

Huge Numpy list - How to get n digit?

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

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

现在我想看看有多少numbers for ex。 number 05,位置 3 和 4 上的 15 位数字。(例如 62-05-1180209,就像我列表中的第一个一样)

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

正如 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])) )

然后 returns:

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

字符串运算比整数运算需要更多 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。