在numpy数组中逐行查找5个连续数字,忽略重复项

时间:2016-02-24 23:09:46

标签: numpy

我有以下阵列(3张牌3张牌)。它们按行排序,我想看看是否有5个连续的数字。下面的代码有效,但有一个错误:当存在重复时(如第1行),结果不正确:

cards=
[[ 12.   6.   6.   5.   4.   2.   1.]
 [ 12.   9.   6.   6.   1.   1.   1.]
 [  6.   6.   1.   1.   0.   0.   0.]]

cardAmount=cards[0,:].size
has4=cards[:,np.arange(0,cardAmount-4)]-cards[:,np.arange(cardAmount-3,cardAmount)]
isStraight=np.any(has4 == 4, axis=1)

has4(显示任何一张牌之间的5个位置相差4)

[[  8.   4.   5.]
 [ 11.   8.   5.]
 [  6.   6.   1.]]

isStraight检查是否有任何行包含4,这表示存在直线。第一行的结果不正确,因为不会忽略重复项。

[ True False False]

难点在于numpy无法逐行执行带有return_counts = True的np.unique,因为结果会有不同的长度。

任何建议都表示赞赏。它必须只是numpy(或者如果速度没有受到影响,则为pandas)。

1 个答案:

答案 0 :(得分:0)

我认为这是解决方案。有没有办法让它变得更简单?

iterations=3
cardAmount=cards[0,:].size
counts=(cards[:,:,None] == np.arange(12,0,-1)).sum(1) # occurences of each cards
present=counts
present[present>1]=1
s1=np.sum(present[:,0:5], axis=1)
s2=np.sum(present[:,1:6], axis=1)
s3=np.sum(present[:,2:7], axis=1)
s=np.stack((s1,s2,s3)).T
s[s < 5] = -1
s[s == 6] = 5
s[s ==7] = 5
s_index=np.argmax(s,axis=1)
straight=s[np.arange(iterations),s_index]>=0