我写了一些代码,但想使其更快。
import numpy as np
test_unit = np.array([[1,2,3,4]])
if set(np.unique(test_unit).astype(int)) >= set((1,2,3)):
print('True')
我想做的是编写if语句,如果矩阵元素具有(至少1 AND 2 AND 3,至少),然后做一份工作。我的真实代码中的test_unit是2 * 2 * 2矩阵,大约是400 * 400 * 200矩阵。如果你们不介意,能否请您给我一些有关此陈述问题的提示?
答案 0 :(得分:1)
一种选择是使用numpy.isin()
和all()
。这应该比转换为集合快很多:
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [10, 11, 12, 13]])
sub = np.array([[1, 5], [6, 11]])
np.all(np.isin(sub, arr))
# True
sub = np.array([[1, 5], [6, 101]])
np.all(np.isin(sub, arr))
# False
答案 1 :(得分:0)
我进行了一些性能测试,并且将any()与列表理解一起使用似乎比np.isin()或set操作要快
N = 1000000
test_unit = np.arange(N)
values = [N-2, N//2,10000] # will return True
all(v in test_unit for v in values) # 100 times: 0.1501
all(np.isin(values,test_unit)) # 100 times: 3.0908
set(values).issubset(test_unit) # 100 times: 8.4157
noValues = [-1,-2,-3] # will return False
all(v in test_unit for v in noValues) # 100 times: 0.0545
all(np.isin(noValues,test_unit)) # 100 times: 2.9616
set(noValues).issubset(test_unit) # 100 times: 8.680