Что такое KDB-эквивалент следующего кода - PullRequest
0 голосов
/ 20 января 2019

Я пытаюсь собрать больше Q, поэтому мне любопытно, как лучше в Q добиться следующего:

В [18]: a = np.arange (12).изменить (3,4)

В [19]: b = np.random.randint (10, size = (3, 4))

В [20]: a Out [20]: массив ([[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]])

В [21]: b Out [21]: массив ([[3, 6, 9, 5], [4, 2, 1, 3], [6, 9, 3, 5]])

В [22]: a [a> 5] = b [a> 5]

В [23]: a Out [23]: массив ([[0, 1, 2, 3], [4, 5, 1, 3], [6, 9, 3, 5]])

Также, как это сделать,

a[np.where(cond)] = b[np.where(cond)]

Спасибо!

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Эквивалентные операции 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

0 голосов
/ 20 января 2019

a: 3 4 # до 12 // Инициализировать матрицу в соответствии с вышеуказанной логикой

b: 3 4 # 12? 10 // Инициализировать матрицу b в соответствии с вышеуказанной логикой

@ '[а;т;:;b @ 't: где каждый a> 5] // На основе приведенной выше логики

...