Используйте strides
, затем получите разницу с numpy.diff
, сравните и последний проверите все True
s на строку numpy.all
:
N = 4
x = np.concatenate([[np.nan] * (N-1), df['rainfall'].values])
def rolling_window(a, window):
shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
strides = a.strides + (a.strides[-1],)
return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
arr = rolling_window(x, N)
print (arr)
[[ nan nan nan 3.1]
[ nan nan 3.1 2. ]
[ nan 3.1 2. 0. ]
[ 3.1 2. 0. 0. ]
[ 2. 0. 0. 12. ]
[ 0. 0. 12. 0. ]
[ 0. 12. 0. 1. ]
[12. 0. 1. 2. ]
[ 0. 1. 2. 3. ]
[ 1. 2. 3. 6. ]
[ 2. 3. 6. 1. ]
[ 3. 6. 1. 2. ]
[ 6. 1. 2. 9. ]]
df['flag'] = (np.diff(arr, axis=1) > 0).all(axis=1)
print (df)
rainfall flag
0 3.1 False
1 2.0 False
2 0.0 False
3 0.0 False
4 12.0 False
5 0.0 False
6 1.0 False
7 2.0 False
8 3.0 True
9 6.0 True
10 1.0 False
11 2.0 False
12 9.0 False
Чтобы получить представление, вы можете увидеть таблицу ниже. Он показывает все операторы Java с наивысшего приоритета, а также их ассоциативность
. Взятые из здесь [ 116]
Итак, как вы можете видеть в соответствии с этим, оба результата будут true
Приоритет оператора - это просто порядок, в котором применяются операции. Например, рассмотрим следующее математическое утверждение:
10 + 6 / 2
Ну, (10 + 6) / 2 = 16 / 2 = 8
, но 10 + (6 / 2) = 10 + 3 = 13
, так что ясно, в каком порядке вы выполняете операции. Математически, какой из этих ответов является правильным ? Если вам задали этот вопрос на экзамене, какой ответ вы должны записать? Приоритет оператора говорит вам об этом.
Вопрос просит вас сделать нечто подобное для булевых операторов.
Попробуйте следующую программу:
public class HelloWorld {
public static void main(String []args){
System.out.println(true || true && false);
System.out.println(true && true || false);
}
}
Оказывается, что оба они true
.
Чтобы узнать больше об этом, вы можете поэкспериментировать с круглыми скобками, чтобы увидеть, как это меняет истинное значение утверждений. Например,
System.out.println((true || true) && false);
- это false
. Сравните это с тем, что
System.out.println(true || true && false);
есть true
. Что это говорит вам о порядке, в котором Java выполняет операции? Ну, то, как я написал скобку, изменило результат, так что ясно, что это неправильно. Из этого можно сделать вывод, что Java должна использовать круглые скобки «по-другому»:
System.out.println(true || (true && false));
Если вы проверите диаграмму в ответе @ Sand, &&
, на самом деле, имеет более высокий приоритет, чем [ 1111], поэтому эта операция применяется первой. Это именно то, что мы видим здесь.