PYTHON 3.6用矢量SNAIL / SPIRAL MATRIX AGAIN

时间:2017-09-24 08:43:36

标签: python algorithm matrix

我希望你做得很棒。

我需要你的帮助,我试图做一些这样的矩阵

[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]

正如您所看到的,这些矩阵由以蜗牛/螺旋形式有机化的素数组成。 我快到了。让我向你解释一下我做了什么。

首先,我制作了一个"基本矩阵",就像这样一个4x4的例子

[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 个答案:

答案 0 :(得分: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.]]