Изменить 2D-массив (Python)

#python #arrays #python-2.7

#python #массивы #python-2.7

Вопрос:

Эй, ребята, итак, у меня есть 2D-массив, который выглядит следующим образом:

 12381.000  63242.000     0.000     0.000     0.000     8.000     9.200     0.000     0.000     
12401.000  8884.000     0.000     0.000    96.000   128.000   114.400    61.600     0.000    
12606.000  74204.000    56.000    64.000    72.000    21.600    18.000     0.000     0.000     
12606.000  105492.000     0.000     0.000     0.000     0.000     0.000     0.000    45.600     
12606.000  112151.000     2.400     4.000     0.000     0.000     0.000     0.000     0.000     
12606.000  121896.000     0.000     0.000     0.000     0.000     0.000    60.800     0.000     
  

(Вырезать пару столбцов из-за форматирования)

Таким образом, он указывает идентификатор сотрудника, идентификатор отдела, за которым следуют 12 месяцев, отработанных каждым сотрудником, и часы, которые они отработали за каждый месяц. Мой 2D-массив — это, по сути, список списков, где каждая строка является отдельным списком. Я пытаюсь преобразовать каждое ненулевое значение в единицу и сохранить все нули. Всего 857 строк и 14 столбцов. Мой код выглядит следующим образом:

 def convBin(A):
    """Nonzero values are converted into 1s and zero values are kept constant.
    """
    for i in range(len(A)):
        for j in range(len(A[i])):
            if A[i][j] > 0:
                A[i][j] == 1
            else:
                A[i][j] == 0
    return A
  

Может кто-нибудь сказать мне, что я делаю не так?

Комментарии:

1. Почему вы думаете , что делаете что-то не так? Какой результат вы ожидали, и что вы получаете вместо этого? В каком формате на самом деле находятся ваши данные — list из list s ? numpy.ndarray ? pandas.DataFrame ?

2. Мой вывод — это тот же самый точный массив. Я не получаю только 0 и 1

3. Мои данные находятся в списке списков

Ответ №1:

Вы выполняете оценку равенства, а не присваивание, внутри вашего цикла:

 A[i][j] == 1
  

должно быть

 A[i][j] = 1
      # ^ note only one equals sign
  

Кроме того, в этом нет необходимости return A ; A модифицируется на месте, поэтому обычно используется неявно return None путем удаления явной return ... строки.

Вы должны иметь в виду, что:

  • На самом деле вы ничего не хотите делать в этом else случае; и
  • Повторение range(len(...)) не является Pythonic — используйте, например enumerate .

Поэтому ваша функция может быть упрощена до:

 def convBin(A):
    """Convert non-zero values in 2-D array A into 1s."""
    for row in A:
        for j, val in enumerate(row):
            if val:
                row[j] = 1