Что-то вроде
a = array([1,1,-1,-2,-3,4,5])
asign = np.sign(a)
signchange = ((np.roll(asign, 1) - asign) != 0).astype(int)
print signchange
array([0, 0, 1, 0, 0, 1, 0])
Теперь numpy.roll выполняет круговое смещение, поэтому, если последний элемент имеет знак, отличающийся от первого, первый элемент в массиве signchange будет равен 1. Если это нежелательно, конечно, можно сделать простой 1004 *
signchange[0] = 0
Кроме того, np.sign считает, что 0 имеет собственный знак, отличный от положительных или отрицательных значений. Например. массив "signchange" для [-1,0,1] будет [0,1,1], даже если нулевая линия была "пересечена" только один раз. Если это нежелательно, можно вставить строки
sz = asign == 0
while sz.any():
asign[sz] = np.roll(asign, 1)[sz]
sz = asign == 0
между строками 2 и 3 в первом примере.