Заменить столбцы в двумерном массиве столбцов на столбцы из другого двухмерного массива - PullRequest
0 голосов
/ 05 июня 2019

У меня есть два 2D-массива, я хочу создать массивы, которые являются копией первого, а затем заменить некоторые столбцы другими из второго.

M1 = np.array([[1.0, 2.0, 3.0, 1.0, 2.0, 3.0], 
               [4.0, 5.0, 6.0, 4.0, 5.0, 6.0]])

M2 = np.array([[1.1, 2.1, 3.1, 1.2, 2.2, 3.2],
               [4.1, 5.1, 6.1., 4.2, 5.2, 6.2]])

Я хочу сделать цикл, который может давать следующие массивы:

M3 = np.array([[1.1, 2.0, 3.0, 1.2, 2.0, 3.0], 
               [4.1, 5.0, 6.0, 4.2, 5.0, 6.0]])

M4 = np.array([[1.0, 2.1, 3.0, 1.0, 2.2, 3.0], 
               [4.0, 5.1, 6.0, 4.0, 5.2, 6.0]])

M5 = np.array([[1.0, 2.0, 3.1, 1.0, 2.0, 3.2], 
               [4.0, 5.0, 6.1, 4.0, 5.0, 6.2]])

1 Ответ

1 голос
/ 05 июня 2019

Вы можете использовать np.where:

selector = [1,0,0,1,0,0]
np.where(selector,M2,M1)
# array([[1.1, 2. , 3. , 1.2, 2. , 3. ],
#        [4.1, 5. , 6. , 4.2, 5. , 6. ]])
selector = [0,1,0,0,1,0]
np.where(selector,M2,M1)
# array([[1. , 2.1, 3. , 1. , 2.2, 3. ],
#        [4. , 5.1, 6. , 4. , 5.2, 6. ]])

и т. Д.

Или в цикле:

M3,M4,M5 = (np.where(s,M2,M1) for s in np.tile(np.identity(3,bool), (1,2)))
M3
# array([[1.1, 2. , 3. , 1.2, 2. , 3. ],
#        [4.1, 5. , 6. , 4.2, 5. , 6. ]])
M4
# array([[1. , 2.1, 3. , 1. , 2.2, 3. ],
#        [4. , 5.1, 6. , 4. , 5.2, 6. ]])
M5
# array([[1. , 2. , 3.1, 1. , 2. , 3.2],
#        [4. , 5. , 6.1, 4. , 5. , 6.2]])

В качестве альтернативы, вы можете скопировать M1 изатем нарезать M2.Это более многословно, но должно быть быстрее:

n = 3
Mj = []
for j in range(n):
    Mp = M1.copy()
    Mp[:,j::n] = M2[:,j::n]
    Mj.append(Mp)

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