Как изменить все значения столбцов матрицы в Python? - PullRequest
0 голосов
/ 01 ноября 2019

Как видно из заголовка, я хочу изменить значение всех столбцов на один и тот же массив, не используя никакой внешней библиотеки, кроме numpy и без использования for, в то время или что-то подобное, потому что я ищу эффективность.

Я думал, что смогу решить эту проблему с помощью срезов, потому что вы можете сделать это для строк.

# Initial matrix
a= [[0,0,0],
    [0,0,0],
    [0,0,0]]

# Wanted array to replace all columns with
b = [1,2,3]

# Matrix after replacement
a= [[1,1,1],
    [2,2,2],
    [3,3,3]]

Это вывод, который я хотел, но по какой-то причине я пока не смог этого добиться, потому чтоЯ хочу сделать это простым способом. Как я могу это сделать? Заранее спасибо.

Ответы [ 5 ]

0 голосов
/ 02 ноября 2019

Было бы замечательно получить больше контекста для этого вопроса, потому что в настоящее время очень мало вопросов. Например, насколько вы контролируете массивы a и b? Во-первых, эта операция может даже не понадобиться.

А пока, вот решение, которое работает, когда массивы похожи на те, что в вашем примере.

import numpy as np


arr_1 = np.array([1, 2, 3])

arr_1_col = arr_1.reshape((-1, 1))

arr_2 = np.tile(A=arr_1_col, reps=3)

Примечание: Вы упомянули NumPy в своем вопросе, я не могу рекомендовать его достаточно. Как только вы выполняете такие задачи, переключение на массивы numpy становится чрезвычайно полезным.

0 голосов
/ 01 ноября 2019

Ваш список недействителен, поэтому я предположил, что вы имели в виду список из 3 списков

a = [
    [0, 0, 0],
    [0, 0, 0],
    [0, 0, 0],
]

b = [1, 2, 3]

for counter, value in enumerate(b):
    a[counter] = [value for i in a[counter]]

print(a)

перечисление дает вам счетчик бесплатно.

обратите внимание, если в элементе больше элементовb, чем a, это приведет к выходу индекса из диапазона ошибок, поэтому, если вы не уверены, проверьте длину перед заменой.

0 голосов
/ 01 ноября 2019

Простое решение с использованием понимания списка:

a = [ [x]*len(row) for row, x in zip(a, b) ]

Это создает новую матрицу, а не изменяет матрицу на месте. Если вы хотите изменить его на месте, вам понадобится вложенный цикл:

for row, x in zip(a, b):
    for i in range(len(row)):
        row[i] = x
0 голосов
/ 01 ноября 2019
a= [[0,0,0],
   [0,0,0],
   [0,0,0]]
b = [1,2,3]

for i, value in enumerate(b):
    a[i] = [value]*len(a[i])

print(a)

вывод:

[[1, 1, 1], [2, 2, 2], [3, 3, 3]]
0 голосов
/ 01 ноября 2019

Создать новую матрицу проще, чем фактически заменить столбцы «на месте». Я предполагаю, что ваша матрица квадратная.

length = len(b)
a = [ [b[i]] * length for i in range(length) ]

Результат

   [[1, 1, 1], [2, 2, 2], [3, 3, 3]]

Теперь, следуя многочисленным просьбам заинтересованных комментаторов, я добавляю решение для прямоугольника A:

length = len(b)
width = len(a[0])
a = [ [b[i]] * width for i in range(length) ]

или, в более питоническом стиле

width = len(a[0])
a = [ [x] * width for x in b ]   
...