我有以下阵列(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)。
答案 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