2017-09-24 69 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