Python - лучший способ установить столбец в 2-м массиве к определенному значению

У меня есть 2-й массив, я хотел бы установить столбец на конкретное значение, мой код ниже. Действительно ли это - лучший способ в Python?

rows = 5
cols = 10

data = (rows * cols) *[0]
val = 10
set_col = 5

for row in range(rows):
    data[row * cols + set_col - 1] = val

Если я хочу установить многие столбцы на конкретное значение, как я мог расширить это

Я хотел бы пользоваться библиотекой стандарта Python только

Спасибо

9
задан Michael Easter 5 February 2010 в 13:26
поделиться

5 ответов

Лучшее решение:

data = [[0] * cols for i in range(rows)]

Для значений cols = 2 , rows = 3 мы получим:

data = [[0, 0],
        [0, 0],
        [0, 0]]

Тогда вы можете получить к нему доступ как:

v = data[row][col]

Что приводит к:

val = 10
set_col = 5

for row in range(rows):
    data[row][set_col] = val

Или более Pythonic (спасибо JF Sebastian):

for row in data:
    row[set_col] = val
14
ответ дан 4 December 2019 в 06:16
поделиться

Пакет NumPy предоставляет мощный объект N-мерного массива. Если data является массивом numpy, то для столбца set_col установить значение val:

data[:, set_col] = val

Complete Example:

>>> import numpy as np
>>> a = np.arange(10)
>>> a.shape = (5,2)
>>> a
array([[0, 1],
       [2, 3],
       [4, 5],
       [6, 7],
       [8, 9]])
>>> a[:,1] = -1
>>> a
array([[ 0, -1],
       [ 2, -1],
       [ 4, -1],
       [ 6, -1],
       [ 8, -1]])
27
ответ дан 4 December 2019 в 06:16
поделиться

Нет ничего принципиально неправильного в том, как вы используете, за исключением того, что было бы проще назвать переменную set_col , чем set_row , поскольку вы устанавливаете столбец.

Итак, установите количество столбцов, просто оберните его другим циклом:

for set_col in [...columns that have to be set...]

Однако есть одна проблема: ваш 2D-массив необычен тем, что он упакован в одномерный массив (Python также может поддерживать 2D-массивы через списки списков ), поэтому я бы обернул все это методами или функциями.

0
ответ дан 4 December 2019 в 06:16
поделиться

В более раннем ответе не указан диапазон , поэтому вы можете попробовать следующее:

cols = 7
rows = 8

data = [[0] * cols for i in range(rows)]

val = 10
set_col = 5

for row in data:
    row[set_col] = val

, чтобы расширить это число до нескольких столбцов, вы можете сохранить номер столбца и его значение в dict . Итак, чтобы установить столбец 5 на 10 и столбец 2 на 7:

cols = 7
rows = 8

data = [[0] * cols for i in range(rows)]

valdict = {5:10, 2:7}

for col, val in valdict.items():
    for row in data:
        row[col] = val

Замена строк и столбцов, как предлагается в другом ответе, делает это немного проще:

cols = 7
rows = 8

data = [[0] * rows for i in range(cols)]

valdict = {5:10, 2:7}

for col, val in valdict.items():
    data[col] = [val] * rows
0
ответ дан 4 December 2019 в 06:16
поделиться

В вашем случае строки и столбцы, вероятно, взаимозаменяемы, т.е. дело в семантике, которая и есть какая. Если это так, то можно сделать так, чтобы столбцы занимали последовательность ячеек в списке data, а затем обнулить их, используя только:

  data[column_start:column_start+rows] = rows * [0]
0
ответ дан 4 December 2019 в 06:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: