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