我試圖驗證一個9x9的陣列中是否有任何數字是重復的,但是需要排除所有的0,因為它們是我以后要解決的。我有一個9x9的陣列,我想驗證在行和列中是否有任何重復的數字,但是從檢查中排除所有0,只有1到9的數字。輸入陣列的例子是:
[[1 0 0 7 0 0 0 0]
[0 3 2 0 0 0 0 0 0]
[0 0 0 6 0 0 0 0 0]
[0 8 0 0 0 2 0 7 0]
[5 0 7 0 0 1 0 0 0]
[0 0 0 0 0 3 6 1 0]
[7 0 0 0 0 0 2 0 9]
[0 0 0 0 5 0 0 0 0]
[3 0 0 0 0 4 0 0 5]]
這是我目前的代碼:
#Checking Columns。
for c in range(9)。
line = (test[:,c])
print(np.unique(line).shape == line.shape)
#檢查行數。
for r in range(9)。
line = (test[r,:])
print(np.unique(line).shape ==line.shape)
然后我想對9x9陣列中的3x3子陣列做完全相同的事情。我同樣需要以某種方式將0排除在檢查之外。以下是我目前的代碼:
for r0 in range(3, 9,3)。)
for c0 in range(3,9,3)。
test1 = test[:r0,:c0] 。
for r in range(3)。
line = (test1[r,:])
print(np.unique(line).shape == line.shape)
for c in range(3)。
line = (test1[:,c])
print(np.unique(line).shape == line.shape)
``
我真的很感謝在這方面的援助。
uj5u.com熱心網友回復:
聽起來你肯定是想驗證一個數獨棋盤的輸入。
你可以提取一個盒子作為:
for r0 in range(0, 9, 3)。)
for c0 in range(0, 9, 3)。
box = test1[r0:r0 3, c0:c0 3]
...測驗np.unique(box)有9個元素...
注意,這只是關于如何提取盒子的元素。 你仍然沒有做任何關于移除零的事情,在這里或在行和列上。
給定一個盒子/行/列,你就需要這樣的東西:
nonzeros = [x for x in box.flatten() if x !=0 ]
assert len(nonzeros) == len(set(nonzeros) )
可能有一個更適合numpy的方法來做這個,但這應該是足夠快的。
uj5u.com熱心網友回復:
通過對陣列的屏蔽,排除零是相當直接的
test = np.array(test)
non_zero_mask = (test != 0)
在這一點上,你可以檢查整個矩陣的唯一性
。np.unique(test[non_zero_mask])
或者你可以對單個行/列進行操作
non_zero_row_0 = test[0, non_zero_mask[0] ]
unique_0 = np.unique(non_zero_row_0)
你可以將上面的邏輯添加到一個回圈中,以獲得你想要的行為
。至于3x3的子數,你可以像你的例子中那樣回圈瀏覽它們。
uj5u.com熱心網友回復:
當你有一個小的東西集合(小的是<=64或128,取決于架構),你可以用位元把它變成一個集合。因此,舉例來說:
bits = ((2**board) >> 1).astype(np.uint16)
注意,你必須在事后使用右移,而不是預先從board中減去1來干凈地處理零。
你現在可以計算三種型別的集合。每個集合都是位在特定排列中的位數OR。對于這個例子,你可以同樣使用sum:
rows = bits.sum(axis=1)
cols = bits.sum(axis=0)
blocks = bits.reshape(3, 3, 3, 3) 。 sum(axis=(1, 3)
現在你所要做的就是比較每個數字的位數和非零元素的數量。當且僅當沒有重復的時候,它們才會相等。重復將導致位元數變小。
有相當有效的方法可以使位元數變小。
有相當有效的位元計數演算法,特別是對于像uint16這樣小的東西。這里有一個例子。如何計算一個32位整數中的設定位數?。我在這里針對較小的尺寸和numpy對其進行了調整:
def count_bits16(arr)。
count = arr - ((arr >> 1) & 0x5555)
count = (count & 0x3333) ((count > > 2) & 0x3333)
return (count * 0x0101) >> 8.
這是每個配置的獨特元素的數量。你需要將它與非零元素的數量進行比較。下面的布林值將告訴你該板塊是否有效:
count_bits16(rows) == np.count_nonzero(board, axis=1) and
count_bits16(cols) == np.count_nonzero(board, axis=0) and
count_bits16(blocks) == np.count_nonzero(board. reshape(3, 3, 3, 3), axis=(1, 3))
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/322450.html
標籤:
