У меня есть 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 только
Спасибо
Лучшее решение:
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
Пакет 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]])
Нет ничего принципиально неправильного в том, как вы используете, за исключением того, что было бы проще назвать переменную set_col
, чем set_row
, поскольку вы устанавливаете столбец.
Итак, установите количество столбцов, просто оберните его другим циклом:
for set_col in [...columns that have to be set...]
Однако есть одна проблема: ваш 2D-массив необычен тем, что он упакован в одномерный массив (Python также может поддерживать 2D-массивы через списки списков ), поэтому я бы обернул все это методами или функциями.
В более раннем ответе не указан диапазон
, поэтому вы можете попробовать следующее:
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
В вашем случае строки и столбцы, вероятно, взаимозаменяемы, т.е. дело в семантике, которая и есть какая. Если это так, то можно сделать так, чтобы столбцы занимали последовательность ячеек в списке data
, а затем обнулить их, используя только:
data[column_start:column_start+rows] = rows * [0]