如何转换嵌套';对于';在python中循环到一行代码中

如何转换嵌套';对于';在python中循环到一行代码中,python,numpy,for-loop,image-processing,numpy-slicing,Python,Numpy,For Loop,Image Processing,Numpy Slicing,我有这个代码示例,我的任务是将虚线内的行减少为一行代码,这意味着将所有for循环转换为一行代码。 我自己想出了一个解决方案,就是: myMat.ravel()[::size + 1] = myMat.ravel()[::size - 1] = 1 除了我自己的解决方案之外,我认为'np.logical_or'函数在这里可能有助于组合阵列切片。 下面是函数。 多谢各位 def myXMat(size): if size != np.uint64(size): return

我有这个代码示例,我的任务是将虚线内的行减少为一行代码,这意味着将所有for循环转换为一行代码。 我自己想出了一个解决方案,就是:

myMat.ravel()[::size + 1] = myMat.ravel()[::size - 1] = 1
除了我自己的解决方案之外,我认为'np.logical_or'函数在这里可能有助于组合阵列切片。
下面是函数。 多谢各位

def myXMat(size):
    if size != np.uint64(size):
        return None
    elif size == 1:
        return 1.0

    myMat = np.zeros((size, size), dtype=np.float64)
    # -------------------------------------------------
    for m in range(size):
        for n in range(size):
            if m == n or m == size - n - 1:
                myMat[m, n] = 1

    # -------------------------------------------------

    return myMat

让我们了解全局;你在创造什么样的模式

In [343]: arr = np.zeros((10,10),int)                                                          
In [344]: for m in range(10): 
     ...:     for n in range(10): 
     ...:         if m==n or m==10-n-1: 
     ...:             arr[m,n] = 1 
     ...:                                                                                      
In [345]: arr                                                                                  
Out[345]: 
array([[1, 0, 0, 0, 0, 0, 0, 0, 0, 1],
       [0, 1, 0, 0, 0, 0, 0, 0, 1, 0],
       [0, 0, 1, 0, 0, 0, 0, 1, 0, 0],
       [0, 0, 0, 1, 0, 0, 1, 0, 0, 0],
       [0, 0, 0, 0, 1, 1, 0, 0, 0, 0],
       [0, 0, 0, 0, 1, 1, 0, 0, 0, 0],
       [0, 0, 0, 1, 0, 0, 1, 0, 0, 0],
       [0, 0, 1, 0, 0, 0, 0, 1, 0, 0],
       [0, 1, 0, 0, 0, 0, 0, 0, 1, 0],
       [1, 0, 0, 0, 0, 0, 0, 0, 0, 1]])
这就是对角线和它的倒点

In [346]: np.diag(np.ones(10,int))                                                             
Out[346]: 
array([[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 1]])
把它翻过来:

In [347]: np.diag(np.ones(10,int))[::-1]                                                       
Out[347]: 
array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
       [0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
       [0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
       [0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
       [0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
       [0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
       [0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
       [0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
       [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]])
把它们加起来:

In [348]: _346+_347                                                                            
Out[348]: 
array([[1, 0, 0, 0, 0, 0, 0, 0, 0, 1],
       [0, 1, 0, 0, 0, 0, 0, 0, 1, 0],
       [0, 0, 1, 0, 0, 0, 0, 1, 0, 0],
       [0, 0, 0, 1, 0, 0, 1, 0, 0, 0],
       [0, 0, 0, 0, 1, 1, 0, 0, 0, 0],
       [0, 0, 0, 0, 1, 1, 0, 0, 0, 0],
       [0, 0, 0, 1, 0, 0, 1, 0, 0, 0],
       [0, 0, 1, 0, 0, 0, 0, 1, 0, 0],
       [0, 1, 0, 0, 0, 0, 0, 0, 1, 0],
       [1, 0, 0, 0, 0, 0, 0, 0, 0, 1]])
或使用索引:

In [352]: arr = np.zeros((10,10),int)                                                          
In [353]: arr[np.arange(10),np.arange(10)] = 1                                                 
In [354]: arr[np.arange(10)[::-1],np.arange(10)] = 1  

使用位或
代替+和
np.diag
处理奇数尺寸。