Matlab처럼 n = 2 일 때 비 매직 사각형 [[1, 3], [4, 2]]
을 반환하지 않고 n < 3이면 오류가 발생합니다.
평소와 같이 홀수, 4로 나눌 수 있지만 4로 나눌 수는 없지만 마지막 하나는 가장 복잡합니다.
def test_magic(ms):
n = ms.shape[0]
s = n*(n**2+1)//2
columns = np.all(ms.sum(axis=0) == s)
rows = np.all(ms.sum(axis=1) == s)
diag1 = np.diag(ms).sum() == s
diag2 = np.diag(ms[::-1, :]).sum() == s
return columns and rows and diag1 and diag2
은 정확성을 확인하기 위해 [test_magic(magic(n)) for n in range(3, 20)]
을 시도해보십시오
def magic(n):
n = int(n)
if n < 3:
raise ValueError("Size must be at least 3")
if n % 2 == 1:
p = np.arange(1, n+1)
return n*np.mod(p[:, None] + p - (n+3)//2, n) + np.mod(p[:, None] + 2*p-2, n) + 1
elif n % 4 == 0:
J = np.mod(np.arange(1, n+1), 4) // 2
K = J[:, None] == J
M = np.arange(1, n*n+1, n)[:, None] + np.arange(n)
M[K] = n*n + 1 - M[K]
else:
p = n//2
M = magic(p)
M = np.block([[M, M+2*p*p], [M+3*p*p, M+p*p]])
i = np.arange(p)
k = (n-2)//4
j = np.concatenate((np.arange(k), np.arange(n-k+1, n)))
M[np.ix_(np.concatenate((i, i+p)), j)] = M[np.ix_(np.concatenate((i+p, i)), j)]
M[np.ix_([k, k+p], [0, k])] = M[np.ix_([k+p, k], [0, k])]
return M
나는이를 테스트 할 수있는 기능을 썼다.
출처
2017-12-15 22:20:27
FTP
https://scipython.com/book/chapter-6-numpy/examples/creating-a-magic-square/ – m7913d
@ m7913d 링크를 사용할 수 없게 될 수도 있으므로 답변을 올리십시오 ... – MaxU
@ 저작권은 어떨까요? – m7913d