gpt4 book ai didi

python - Numpy:检查一维数组是否是另一个数组的子数组

转载 作者:太空狗 更新时间:2023-10-30 00:52:43 25 4
gpt4 key购买 nike

给定两个通用的 numpy 一维数组(无法保证任何值),我需要检查一个是否是另一个的子数组。

通过转换为字符串很短而且很容易,但可能不是最有效的:

import numpy as np

def is_sub_arr(a1, a2):
return str(a2).strip('[]') in str(a1).strip('[]')

arr1 = np.array([9, 1, 3, 2, 7, 2, 7, 2, 8, 5])
arr2 = np.array([3, 2, 7, 2])
arr3 = np.array([1,3,7])

print(is_sub_arr(arr1,arr2)) # True
print(is_sub_arr(arr1,arr3)) # False

是否有一种有效的内置/原生 numpy 方法来做到这一点?

最佳答案

编辑:您还可以使用 Numba 以更少的内存使事情变得更快(例如 1000 倍):

import numpy as np
import numba as nb

def is_sub_arr_np(a1, a2):
l1, = a1.shape
s1, = a1.strides
l2, = a2.shape
a1_win = np.lib.stride_tricks.as_strided(a1, (l1 - l2 + 1, l2), (s1, s1))
return np.any(np.all(a1_win == a2, axis=1))

@nb.jit(parallel=True)
def is_sub_arr_nb(a1, a2):
for i in nb.prange(len(a1) - len(a2) + 1):
for j in range(len(a2)):
if a1[i + j] != a2[j]:
break
else:
return True
return False

# Test
np.random.seed(0)
arr1 = np.random.randint(100, size=100_000)
arr2 = np.random.randint(100, size=1_000)
print(is_sub_arr_np(arr1, arr2))
# False
print(is_sub_arr_nb(arr1, arr2))
# False

# Now enforce a match at the end
arr1[-len(arr2):] = arr2
print(is_sub_arr_np(arr1, arr2))
# True
print(is_sub_arr_nb(arr1, arr2))
# True

# Timing
%timeit is_sub_arr_np(arr1, arr2)
# 99.4 ms ± 567 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit is_sub_arr_nb(arr1, arr2)
# 124 µs ± 863 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

不确定这是最有效的答案,但这是一种可能的解决方案:

import numpy as np

def is_sub_arr(a1, a2):
l1, = a1.shape
s1, = a1.strides
l2, = a2.shape
a1_win = np.lib.stride_tricks.as_strided(a1, (l1 - l2 + 1, l2), (s1, s1))
return np.any(np.all(a1_win == a2, axis=1))

arr1 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
arr2 = np.array([4, 5, 6])
arr3 = np.array([4, 5, 7])
print(is_sub_arr(arr1, arr2))
# True
print(is_sub_arr(arr1, arr3))
# False

关于python - Numpy:检查一维数组是否是另一个数组的子数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57004175/

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