【问题标题】:PYTHON 3.6 replacing the elements of a matrix by the elements of a vector SNAIL/SPIRAL MATRIX AGAINPYTHON 3.6 用向量 SNAIL/SPIRAL MATRIX AGAIN 的元素替换矩阵的元素
【发布时间】:2017-09-24 08:43:36
【问题描述】:

我希望你做得很棒。

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

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

我知道我的错误在 las 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.]]

如您所见,最后一个矩阵不正确。

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

【问题讨论】:

  • 您是否打算接受任何问题的答案?

标签: python algorithm matrix


【解决方案1】:

你是对的,你就快到了。

只需使用带有素数索引的预生成矩阵来访问您的素数向量(仅最后几行):

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

【讨论】:

猜你喜欢
  • 2017-02-27
  • 2017-05-09
  • 1970-01-01
  • 2016-11-13
  • 2013-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多