Python - лучший способ установить столбец в 2d массиве на конкретное значение - PullRequest
8 голосов
/ 05 февраля 2010

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

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

Спасибо

Ответы [ 5 ]

26 голосов
/ 05 февраля 2010
Пакет

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

data[:, set_col] = val

Полный пример:

>>> 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]])
13 голосов
/ 05 февраля 2010

Лучшее решение было бы:

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 (спасибо J.F. Sebastian):

for row in data:
    row[set_col] = val
0 голосов
/ 05 февраля 2010

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

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 голосов
/ 05 февраля 2010

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

  data[column_start:column_start+rows] = rows * [0]
0 голосов
/ 05 февраля 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...