Ищем ту же функцию if-оператора, но быстрее - PullRequest
0 голосов
/ 21 июня 2019

Я написал несколько кодов, но хочу сделать это быстрее.

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, 2 и 3), то делают работу. Test_unit в моем реальном коде - это матрица 2 * 2 * 2 в матрице размером 400 * 400 * 200. Если вы, ребята, не возражаете, не могли бы вы дать мне несколько советов по этому вопросу?

Ответы [ 2 ]

1 голос
/ 21 июня 2019

Один из вариантов - использовать 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
0 голосов
/ 21 июня 2019

Я провел несколько тестов производительности, и использование any () с пониманием списка кажется быстрее, чем np.isin () или операций над множествами

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...