如何用Python中的另一个数组替换数组的每个元素?

问题描述 投票:4回答:2

MWE:让我们考虑以下示例。

L0=[[b,0],[b,b]], L1=[[b,b],[b,1]], L2=[[b,b],[2,b]]

S=[[0,1,2],[2,0,1]] 

是否有任何方法将S的每个元素替换为L0为0,L1替换为1,L2替换为2以获得S1,如图所示?

实际上,我想要一个python程序来检查:如果S的元素为零,那么它将由预定义的2D数组替换0,依此类推。

python arrays numpy block
2个回答
5
投票

是。我们可以先构造一个包含L0L1L2的numpy数组:

A = np.array([L0, L1, L2])

接下来,我们构建一个S的numpy数组:

B = np.array(S)

现在我们有C = A[B](或@Divakar建议的C = np.take(A,B,axis=0)):

>>> C = np.take(A,B,axis=0)
>>> C
array([[[[b, 0],
         [b, b]],

        [[b, b],
         [b, 1]],

        [[b, b],
         [2, b]]],


       [[[b, b],
         [2, b]],

        [[b, 0],
         [b, b]],

        [[b, b],
         [b, 1]]]])

这当然不是我们想要的:我们想要获得2D阵列。我们可以通过首先转置(或swapaxes,如@PaulPanzer建议)然后重塑,我们获得:

>>> C.transpose(0,2,1,3).reshape(4,6)
array([[b, 0, b, b, b, b],
       [b, b, b, 1, 2, b],
       [b, b, b, 0, b, b],
       [2, b, b, b, b, 1]])

由于46当然取决于L0L1L2S的尺寸大小,我们也可以根据这个尺寸计算它们:

A = np.array([L0, L1, L2])
B = np.array(S)
m, n = B.shape
_, u, v = A.shape
np.take(A,B,axis=0).swapaxes(1,2).reshape(u*m, v*n)

就像@DSM所说,从Numpy-1.13开始,为此目的有np.block函数,我们可以把它写成:

>>> np.block([[A[i] for i in row] for row in S])
array([[b, 0, b, b, b, b],
       [b, b, b, 1, 2, b],
       [b, b, b, 0, b, b],
       [2, b, b, b, b, 1]])

1
投票

如果不同的构建块Li的数量不大,我们可以使用Kronecker产品np.kron

import numpy as np

L0=[[b,0],[b,b]]; L1=[[b,b],[b,1]]; L2=[[b,b],[2,b]]

S=[[0,1,2],[2,0,1]] 

S1 = sum(np.kron(np.equal(i, S), L) for i, L in enumerate((L0, L1, L2)))

假设S1b = 3的价值:

[[3 0 3 3 3 3]
 [3 3 3 1 2 3]
 [3 3 3 0 3 3]
 [2 3 3 3 3 1]]
© www.soinside.com 2019 - 2024. All rights reserved.