Эквивалентные операции KDB для ваших команд упомянуты ниже.
ПРИМЕЧАНИЕ: Обратите внимание, что эти функции KDB и numpy не полностью эквивалентны.Они ведут себя одинаково только для определенных условий ввода.Подробно прочитайте поведение функций KDB, поскольку они сильно перегружены.Я предоставил ссылки внизу для операторов kdb, используемых здесь.
1.a = np.arange (12) .reshape (3,4)
Эквивалентом numpy 'arange' с одним входом в KDB является оператор 'til'.Оператор изменения формы в KDB - это «#».
Эквивалентная команда KDB для этого будет:
q) a:2 4 #til 12
2.b = np.random.randint (10, size = (3, 4))
'?'Оператор в KDB дает случайные значения.Он не поддерживает размер, но это может быть легко достигнуто с помощью оператора формы.
q) 2? 4 / output 1 3 (2 random values)
q) 3 4# 12?10
Или мы можем сделать для этого универсальную функцию:
q) {(y;z )#?[y*z;x]} [8 ;3 ;4]
3.a [np.where (cond)] = b [np.where (cond)] * 1027 *
Существуют разные способы сделать это в KDB.Это зависит от размера вашего списка, какое решение использовать.Некоторые из них будут работать лучше в небольшом списке, а некоторые - лучше в большом списке.Поэтому протестируйте их в соответствии с вашим проектом.
Все три решения, упомянутые ниже, дадут вам желаемый результат.
q) a: 3 4#til 12;
q) b: (3 6 9 5;4 2 1 3;6 9 3 5)
q) a:(a*not i)+b*i:a>5 /solution 1
Использование @ и каждого из них
q) a:{@[x;y;:;z]}'[a;i;b@'i: where each a > 5] / solution 2
q) a:@'[a;i;:;b@'i: where each a > 5] /short form
Или измените исходный массив на месте, используя оператор точки (.):
q) l:(til count a),'enlist each where@'a>5
q) {.[`a;x;:;y]}'[l;b ./:l] /solution 3
q) .'[`a;l;:;b ./:l] short form
Подробнее см. Здесь:
https://code.kx.com/q/ref/card/
https://code.kx.com/q/ref/arith-integer/#til
https://code.kx.com/q/ref/unclassified/#apply
https://code.kx.com/q/ref/select/#index-at
https://code.kx.com/q/ref/random/#roll