Для циклов и матриц, замена строк - PullRequest
0 голосов
/ 20 января 2019

Я пытаюсь создать функцию first_rpt, которая будет принимать в качестве входной матрицы / массива M и выводить массив, который изменяет каждую строку в матрице на значения в строке номер 0 (первая строка).

Если у меня есть матрица a=np.array([[1,1,1],[2,2,2],[3,3,3]]), я бы хотел, чтобы функция изменила это значение на a=[1,1,1],[1,1,1],[1,1,1]

def first_rpt(M):  
    new_array=M    
    M=np.array(M)    
    for i in len(M):    
    M[i]=M[0]    
    return new_array

Этот код возвращает ошибку "int" object is not iterable.При изменении len(M) на range(len(M)) просто выводится та же матрица, что была введена.

Что я делаю не так?

Ответы [ 3 ]

0 голосов
/ 20 января 2019

Ответ U9-Forward идеален, но, поскольку вы настаиваете на итерации по массиву ...

Просто удалите new_array и итерируйте по диапазону.

def first_rpt(M):
    for i in xrange(len(M)):  # "xrange" in case the array is very big
        M[i] = M[0]
    return M

В вашем коде вы присвоили new_array = M, но затем переназначили M, что означало, что new_array остался указывать на старый M.Вы также можете решить проблему, переместив new_array = M после переназначения M, но в этом нет никакого смысла.


Полный тестовый код

import numpy as np

def first_rpt(M):
    for i in xrange(len(M)):
        M[i] = M[0]
    return M

a = np.array([[1,1,1], [2,2,2], [3,3,3]])
print first_rpt(a)
0 голосов
/ 20 января 2019
def first_rpt(M):  
   for i in range(1, len(M)):    
      M[i]=M[0]    
   return 

В этом задании вам не нужен "new_array"

0 голосов
/ 20 января 2019

Почему бы просто не использовать:

>>> import numpy as np
>>> a=np.array([[1,1,1],[2,2,2],[3,3,3]])
>>> def first_rpt(M):
    M[1:]=M[0]
    return M

>>> first_rpt(a)
array([[1, 1, 1],
       [1, 1, 1],
       [1, 1, 1]])
>>> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...