numpy 过滤3个可能值的超大数组

sgtfey8w  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(94)

我有一个2D数组的0,1和2的列数非常大。我试图只选择那些连续的零不超过一定数量的行。我的方法是将数组转换为字符,合并列,然后对其应用正则表达式过滤器。但这是非常缓慢的。特别是每行字符的转换和连接。有没有办法让它快一个数量级?也许用另一种策略?

import re
import numpy as np

n=100
k = 1000
x = np.random.choice([0,1,2], replace=True, size=(n,k))
s = np.apply_along_axis(lambda t: ''.join(t) , 1, x.astype(str))

N_ramp=3
mask = [re.search(r'[12]0{1,'+str(N_ramp)+r'}[12]', i) is None for i in s]

字符串

l5tcr1uw

l5tcr1uw1#

使用this answer,您可以获得连续True值的计数。你可以把它应用到你的问题中,如果值为0,你的数组就变成一个布尔数组True,否则就变成False。然后将链接算法应用于每一行,并检查结果中是否有满足条件(所需的连续零的数量)的值。我把它们存储在一个列表中。打印出总和显示有多少行满足条件。

import numpy as np

n = 100
k = 1000
x = np.random.choice([0, 1, 2], replace=True, size=(n, k))

def get_consecutive_counts(arr):
    # https://stackoverflow.com/a/24343375/12131013
    return np.diff(np.where(np.concatenate(([arr[0]],
                                            arr[:-1] != arr[1:],
                                            [True])))[0])[::2]

def has_N_consecutive(arr, N):
    return np.any(get_consecutive_counts(arr) > N)

N_consecutive = 7
res = [has_N_consecutive(row, N_consecutive) for row in x == 0]
print(sum(res))

字符串

相关问题