我正在尝试获取更多的Q,所以我对Q中实现以下目标的最佳方法感到好奇。
在[18]中:a = np.arange(12).reshape(3,4)
在[19]中:b = np.random.randint(10,size =(3,4))
In [20]:a Out [20]:array([[0,1,2,3], [4,5,6,7], [8、9、10、11]])
In [21]:b Out [21]:array([[3,6,9,5], [4,2,1,3], [6,9,3,5]])
在[22]中:a [a> 5] = b [a> 5]
In [23]:a Out [23]:array([[0,1,2,3], [4、5、1、3], [6,9,3,5]])
还有什么好方法,
a[np.where(cond)] = b[np.where(cond)]
谢谢!
答案 0 :(得分:2)
下面介绍了命令的等效KDB操作。
注意::请注意,这些KDB和numpy函数并不完全相同 当量。它们仅在某些输入条件下表现相似。详细阅读KDB函数的行为特别是因为 他们超负荷。 我在底部提供了此处使用的kdb运算符的链接。
1。 a = np.arange(12).reshape(3,4)
在KDB中单输入的numpy'arange'等效为'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)]
在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
或使用dot(。)运算符在适当的位置更改原始数组:
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
答案 1 :(得分:0)
a:3 4#til 12 //根据上述逻辑初始化矩阵
b:3 4#12?10 //按照上述逻辑初始化b矩阵
@'[a; ; :; b @'t:其中每个a> 5] //根据上述逻辑