Где происходит эта ошибка? Это фундаментальная информация - для нас, но особенно для вас!
@ edison говорит, что это выражение argwhere
. Я попытаюсь воссоздать этот шаг, начав с предположения о том, как выглядит diffs
:
In [8]: x = np.ones(5)*.1
In [9]: x
Out[9]: array([0.1, 0.1, 0.1, 0.1, 0.1])
In [10]: s = np.cumsum(x)
In [11]: s
Out[11]: array([0.1, 0.2, 0.3, 0.4, 0.5])
In [12]: s-1
Out[12]: array([-0.9, -0.8, -0.7, -0.6, -0.5])
In [13]: np.sign(s-1)
Out[13]: array([-1., -1., -1., -1., -1.])
In [14]: np.diff(np.sign(s-1))
Out[14]: array([0., 0., 0., 0.])
In [15]: np.abs(np.diff(np.sign(s-1)))
Out[15]: array([0., 0., 0., 0.])
In [16]: np.abs(np.diff(np.sign(s-1))).astype(bool)
Out[16]: array([False, False, False, False])
Независимо от деталей к этому моменту, можно предположить, что s
является массивомтолько с False
. where
находит элементы True
в этом массиве;их нет.
In [17]: np.where(_)
Out[17]: (array([], dtype=int64),)
argwhere
- это транспонирование этого - один столбец для каждого измерения и одна строка для каждого найденного элемента.
In [18]: np.argwhere(_)
Out[18]: array([], shape=(0, 2), dtype=int64)
In [19]: _[0]
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-19-aa79beb95eae> in <module>
----> 1 _[0]
IndexError: index 0 is out of bounds for axis 0 with size 0
Итак, ваша первая строказащита заключается в проверке формы возвращаемого массива:
c = np.argwhere(s)
if c.shape[0]>0:
c = c[0,0]
p = x[c], y[c]
else:
# what do you want to do if non of `s` are true?
Оттуда вы можете работать в обратном направлении, следя за тем, чтобы diffs
или numbers
были правильными и всегда находили действительные c
. Но независимо от того, при использовании where
или argwhere
, будьте осторожны, если предположите, что он обнаружил определенное количество предметов.