Как преобразовать вложенные циклы for в одну строку кода в python - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть этот пример кода, и моя задача состоит в том, чтобы уменьшить строки внутри пунктирных линий в одну строку кода, что означает преобразование циклов all 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

1 Ответ

0 голосов
/ 02 апреля 2020

Давайте получим большую картину; какой шаблон вы создаете?

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  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...