2017-09-24 101 views
0

我希望你能做得很棒。PYTHON 3.6用矢量元素替換矩陣的元素SNAIL/SPIRAL MATRIX AGAIN

我需要你的幫助,我嘗試做一些矩陣這樣

[2 3] 
[7 5] 

[17 19 23] 
[13 2 3 ] 
[11 7 5 ] 

[17 19 23 29] 
[13 2 3 31] 
[11 7 5 37] 
[53 47 43 41] 

正如你所看到的,這些矩陣是由在蝸牛/螺旋形organiced素數。 我快到了。讓我向你解釋我做了什麼。

第一,我提出的「基礎基質」,就像這樣對於4×4例子

[6 7 8 9] 
[5 0 1 10] 
[4 3 2 11] 
[15 14 13 12] 

第二,我提出由前16張素數的矢量沒有如圖1所示,本實施例中。就這樣

[ 2. 3. 5. 7. 11. 13. 17. 19. 23. 29. 31. 37. 41. 43. 47. 53.] 

第三,我想替換矩陣向量的元素,但是這最後一步是我的問題

我有這個代碼

n = input("enter the length of the matrix (maximum 12): ") 

if (n <= 0): 
    print("please enter a positive integer") 

elif (n > 0): 
    M = np.zeros([n, n]) 
    init = 0 
    nlimit = n - 1 
    c = 0          

    if (n % 2 == 0): 
     while (c < (n*n)): 
      for i in range(init, nlimit, 1): 
       c = c + 1 
       M[nlimit, i] = c 
      for i in range(nlimit, init, -1): 
       c = c + 1 
       M[i, nlimit] = c 
      for i in range(nlimit, init, -1): 
       c = c + 1 
       M[init, i] = c 
      for i in range(init, nlimit, 1): 
       c = c + 1 
       M[i, init] = c 
      init = init + 1 
      nlimit = nlimit - 1 


    if (n % 2 != 0): 
     while (c < ((n*n)-1)): 
      for i in range(nlimit, init, -1): 
       c = c + 1 
       M[init, i] = c 
      for i in range(init, nlimit, 1): 
       c = c + 1 
       M[i, init] = c 
      for i in range(init, nlimit, 1): 
       c = c + 1 
       M[nlimit, i] = c 
      for i in range(nlimit, init, -1): 
       c = c + 1 
       M[i,nlimit] = c 
      init = init +1 
      nlimit = nlimit - 1 
     M[(n - 1)/2, (n - 1)/2] = n * n 


R = (n*n)*np.ones([n,n]) 
T = R - M    #T = base matrix 
A = T 
print(T) 


q = 1            
w=np.zeros(n*n) 
w[0] = 2 

for i in range(3,1000,2): 
    p = 0 
    for j in range (3,i+1,2): 

     if (i % j == 0): 
      p = p + 1 

    if (p == 1): 
     w[q] = i 
     q = q + 1 

    if (q == (n*n)): 
     break 

print (w) 


for k in range (0,n*n,1): 
    for m in range (0, n-1, 1): 
     for z in range (0, n-1, 1): 
      if (T[m,z] == k): 
       A[m,z] = w[k] 
print(A) 

嘗試我知道我的錯誤在拉斯維加斯6線,但我不知道它是什麼。 此程序將顯示以下三種事 1)的基矩陣 2)的素數矢量 3)與素數

對於n = 4,這是輸出

[[ 6. 7. 8. 9.] 
[ 5. 0. 1. 10.] 
[ 4. 3. 2. 11.] 
[ 15. 14. 13. 12.]] 

[ 2. 3. 5. 7. 11. 13. 17. 19. 23. 29. 31. 37. 41. 43. 47. 53.] 

[[ 17. 19. 23. 9.] 
[ 43. 43. 19. 10.] 
[ 37. 19. 43. 11.] 
[ 15. 14. 13. 12.]] 

由於螺旋矩陣你可以看到最後一個矩陣是不正確的。

我真的很需要你的幫助,我希望你能做到,非常感謝你。

+1

你打算接受在您的任何問題的任何答案嗎? – erasmortg

回答

0

你是對的,你快到了。

只需使用預先生成與素數指數矩陣(僅最後幾行)訪問素數的向量:

for k in range(n): 
    for m in range(n): 
     idx = int(A[k,m]) 
     A[k,m] = w[idx] 
print(A) 

元素A[k,m]在你預先生成矩陣的索引你想要的素數。您需要將其轉換爲int(從float)以便將其用於建立索引。

結果如您所願:

[[ 17. 19. 23. 29.] 
[ 13. 2. 3. 31.] 
[ 11. 7. 5. 37.] 
[ 53. 47. 43. 41.]] 
+0

你是對的。非常感謝。 –

+0

不客氣!請注意,感謝某人在StackOverflow上提供答案的最佳方式是[upvote和/或接受該答案](https://stackoverflow.com/help/someone-answers)。 – randomir