Как реализовать понимание с использованием массивов NumPy?

#numpy #sympy

#numpy #sympy

Вопрос:

У меня есть два кортежа массивов NumPy. Один кортеж является перестановкой другого:

 t = (np.identity(2), np.identity(3),)
s = (np.identity(3), np.identity(2),)
 

Мне нужен кортеж, который указывает на перестановку:

 tuple(s.index(matrix) for matrix in t)
 

Однако это приводит к ошибке ValueError, потому что, когда NumPy сравнивает массивы, он делает это поэлементно:

 ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
 

Вопрос: Как я могу заставить NumPy выполнять a.all() сравнение в понимании?

Примечание: это не проблема в SymPy. Следующее возвращает (1, 0) , как и ожидалось:

 t = (sp.eye(2), sp.eye(3),)
s = (sp.eye(3), sp.eye(2),)
tuple(s.index(matrix) for matrix in t)
 

Комментарии:

1. Это похоже на серьезную проблему XY. Т.Е., Вероятно, существует гораздо более подходящий подход, который не является O (n ^ 3). Зачем вы это делаете?

2. Здесь не просто отсутствует all . index сравнивается matrix с каждым элементом s . Сначала is выполняется тест. В противном случае он пытается == . Если они совпадают по форме, вы получаете логическую матрицу, а если они отличаются по форме, вы получаете предупреждение об устаревании. Сравнивать массивы, которые могут отличаться по форме, не очень хорошая идея.

3. Также обратите внимание, что в общем случае матрицы numpy содержат числа с плавающей запятой, которые могут быть почти, но не совсем равными из-за потери точности.