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

按行查找numpy数组中的5个连续数字,忽略重复项,numpy,Numpy,我有以下阵列(3副7张牌)。它们是按行排序的,我想看看是否有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

我有以下阵列(3副7张牌)。它们是按行排序的,我想看看是否有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的差异)

isStraight检查是否有任何行包含4,这意味着有一条直线。第一行的结果不正确,因为重复项未被忽略

[ True False False]
困难在于,在numpy中,无法逐行使用return_counts=True来执行np.unique,因为结果的长度不同


如有任何建议,我们将不胜感激。它必须是numpy(或者熊猫,如果速度不受影响)。

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

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
iterations=3
cardAmount=卡[0,:]。大小
计数=(卡片[:,:,无]==np.arange(12,0,-1))。总和(1)#每张卡片的出现次数
当前=计数
当前[当前>1]=1
s1=np.和(当前[:,0:5],轴=1)
s2=np.和(当前[:,1:6],轴=1)
s3=np.和(当前[:,2:7],轴=1)
s=np.stack((s1,s2,s3)).T
s[s<5]=-1
s[s==6]=5
s[s==7]=5
s_指数=np.argmax(s,轴=1)
直线=s[np.arange(迭代),s_指数]>=0

当我完成卡片手分类时,我将分类后的数字与
范围(5)
进行比较,或者查看差异(可能是一个1字符串)。我不确定你的意思。你能使用一个有5个连续字符的示例案例吗。数字,并且至少有一行中有重复项?此外,请为这种情况添加预期的o/p。是的,这也将被视为直接扑克
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