KDB / Q Сброс случайных элементов во вновь созданном списке (числовой или символ / символ)

У меня есть случайный (Y) список с элементами (X) (начальные элементы во 2-м измерении), где Я хочу сбросить значения на случайный коэффициент (Z), который находится между 0f и 1f. Для числовых списков этот код отлично работает

q)seed:20
q){(0>z-(x#seed)?\:1f)*(x#seed)?\:y}[3;10;0.25]

Как я могу расширить этот код, чтобы он работал также в случае символов (или списков символов), подобных этому

q){(0>z-(x#seed)?\:1f)*(x#seed)?\:y}[3;`8;0.25]
q){(0>z-(x#seed)?\:1f)*(x#seed)?\:y}[3;" ";0.25]

Думаю, проблема в умножении в середине, но я не знаю, как сделать его более общим.

Может быть, есть даже более элегантное решение этой проблемы, чем создание двух списков и обработка их таким образом.

Спасибо


person Martin Mlostek    schedule 31.05.2015    source источник
comment
можете ли вы привести пример того, каким должен быть результат, когда параметры равны [3;`8;0.25]?   -  person Manish Patel    schedule 01.06.2015


Ответы (1)


Чтобы сделать его универсальным, нужно было бы использовать логические значения для индексации, а не использовать их для умножения (как вы сейчас делаете). Однако для нечисловых списков вам нужно будет сбросить значения до нуля, а не до нуля. Эти нули должны быть правильными нулем, соответствующими типу ввода (то есть 0Ni для целых чисел, 0Nj для длинных, `для символов" "для символов и т. Д.) - это может быть достигнуто с помощью 'first 0 #'

Таким образом, общая версия вашей функции будет примерно такой:

q){seed cut @[(x*seed)?y;where 0<=z-(x*seed)?1f;:;first 0#y]}[3;10;0.25]
  9 3 9 4 9     9   8 7 6 1   3 4 9 3 9
2 6 5 3 5 6 0 8 9 0   8 9   1 5 7 4 3 2
3 7 6 9 8 2 2 8 9   8 2       5 1 2 1 3

q){seed cut @[(x*seed)?y;where 0<=z-(x*seed)?1f;:;first 0#y]}[3;`8;0.25]
eklinmcm ikfknpam          pjncfmob mmhpkfap                   bhakgffh khkag..
         neohaicn fiajkigo          bllnecdn          hpnommjb pkhpildh lacif..
         feinbhmg mbpkjapc                   dgippbmi lelmkfoe               ..

q){seed cut @[(x*seed)?y;where 0<=z-(x*seed)?1f;:;first 0#y]}[3;" ";0.25]
"rk an i nts d cxfkp "
"oiusc udpliqbqnzapql"
"qhk yauhroflprr lwuw"

Сказав это, возможно, это не лучший способ подойти к исходной проблеме - это всего лишь предложение сделать ее общей.

PS. Если вам все еще нужны нули в числовых списках, используйте заполнение нулями

q)0^{seed cut @[(x*seed)?y;where 0<=z-(x*seed)?1f;:;first 0#y]}[3;10;0.25]
7 0 5 1 1 0 3 2 0 0 0 0 0 3 0 9 7 9 7 7
6 9 4 0 4 4 0 6 2 9 5 1 0 0 8 9 6 3 4 0
5 0 8 1 1 6 4 9 0 1 9 5 8 9 0 3 9 0 0 1
person terrylynch    schedule 01.06.2015