Чтобы понять имя: трассировка стека представляет собой список исключений (или вы можете сказать список «Причина от»), от самого поверхностного исключения (например, исключение уровня обслуживания) до самого глубокого (например, исключения базы данных) , Точно так же, как причина, которую мы называем «стеком», состоит в том, что стек - это First in Last out (FILO), самое глубокое исключение произошло в самом начале, затем цепочка исключений была сгенерирована серией последствий, поверхность Exception была последней один из них произошел вовремя, но мы его видим в первую очередь.
Ключ 1: Трудная и важная вещь здесь должна быть понята: самая глубокая причина не может быть «первопричиной», потому что если вы пишете «плохой код», это может вызвать некоторое исключение, которое находится ниже уровня его. Например, плохой sql-запрос может вызвать сброс соединения SQLServerException в кубе вместо ошибки синфакса, которая может находиться только в середине стека.
-> Определить основную причину в середине - это ваша задача.
Ключ 2: Еще одна сложная, но важная вещь находится внутри каждого блока «Причина», первая строка была самым глубоким слоем и первым местом для этого блока. Например,
Exception in thread "main" java.lang.NullPointerException
at com.example.myproject.Book.getTitle(Book.java:16)
at com.example.myproject.Author.getBookTitles(Author.java:25)
at com.example.myproject.Bootstrap.main(Bootstrap.java:14)
Book.java:16 был вызван Auther.java:25, который был вызван Bootstrap.java:14, Book.java:16 был основной причиной. Здесь прикрепите диаграмму сортировки стека следов в хронологическом порядке.
Вот решение с использованием продукта от itertools. Создание списка строк и столбцов с суммами == 0 и поиск комбинаций между ними.
from itertools import product
my_array = np.matrix([[3, 7, 0, 0],
[0, 2, 0, 0],
[0, 0, 0, 0],
[0, 0, 1, 0]])
a = np.argwhere(my_array.sum(axis = 1) == 0)[:,0]
b = np.argwhere(my_array.sum(axis = 0) == 0)[:,1]
np.array(list(product(a,b)))
Проблема с вашим выражением where
возникает внутри него, когда вы пытаетесь объединить два условия:
In [210]: np.sum(arr, axis=1) == 0 and np.sum(arr, axis=0) == 0
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-210-46c837435a31> in <module>
----> 1 np.sum(arr, axis=1) == 0 and np.sum(arr, axis=0) == 0
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
In [211]: (np.sum(arr, axis=1) == 0) & (np.sum(arr, axis=0) == 0)
Out[211]: array([False, False, False, False])
Вы должны обернуть тест ==
внутри (), чтобы он появился первым, и Вы должны использовать &
для поэтапного выполнения and
. and
является скалярной операцией и не очень хорошо работает с булевыми массивами.
Тесты строк и столбцов:
In [212]: arr.sum(0)==0
Out[212]: array([False, False, False, True])
In [213]: arr.sum(1)==0
Out[213]: array([False, False, True, False])
, но вам нужна какая-то внешняя или декартова комбинация, а не простая поэлементная комбинация (это было бы более очевидно, если бы было различное количество строк и столбцы).
In [218]: (arr.sum(1)==0)[:,None] & (arr.sum(0)==0)
Out[218]:
array([[False, False, False, False],
[False, False, False, False],
[False, False, False, True],
[False, False, False, False]])
In [219]: np.where(_)
Out[219]: (array([2]), array([3]))
Или с параметром keepdims
из sum
:
In [220]: arr.sum(0, keepdims=True)==0
Out[220]: array([[False, False, False, True]])
In [221]: arr.sum(1, keepdims=True)==0
Out[221]:
array([[False],
[False],
[ True],
[False]])
In [222]: np.where(_220 & _221) # Out[220] etc
Out[222]: (array([2]), array([3]))