用来自另一个2D数组的列替换2D numpy数组中的列

时间:2019-06-05 13:05:14

标签: python-3.x numpy indexing

我有两个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 个答案:

答案 0 :(得分:1)

您可以使用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