如何用 Python 中的另一个数组替换数组的每个元素?
How to replace each element of an array with another array in Python?
MWE: 让我们考虑下面的例子。
L0=[[b,0],[b,b]], L1=[[b,b],[b,1]], L2=[[b,b],[2,b]]
S=[[0,1,2],[2,0,1]]
有什么方法可以像图中那样用 L0 替换 0 和 L1 替换 1 以及 L2 替换 2 来替换 S 的每个元素以获得图像中的 S1?
实际上,我想要一个 python 程序来检查:如果 S 的元素为零,那么它将用预定义的二维数组等替换 0。
是的。我们可以先构造一个包含L0
、L1
和L2
:
的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]]]])
这当然不是我们想要的:我们想要获得一个二维数组。我们可以通过首先转置(或 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]])
因为4
和6
当然取决于L0
、L1
、L2
和S
的维度大小,我们也可以根据那个尺寸来计算它们:
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]])
如果不同构建块的数量 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)))
假设 b = 3
的 S1
的值:
[[3 0 3 3 3 3]
[3 3 3 1 2 3]
[3 3 3 0 3 3]
[2 3 3 3 3 1]]
MWE: 让我们考虑下面的例子。
L0=[[b,0],[b,b]], L1=[[b,b],[b,1]], L2=[[b,b],[2,b]]
S=[[0,1,2],[2,0,1]]
有什么方法可以像图中那样用 L0 替换 0 和 L1 替换 1 以及 L2 替换 2 来替换 S 的每个元素以获得图像中的 S1?
实际上,我想要一个 python 程序来检查:如果 S 的元素为零,那么它将用预定义的二维数组等替换 0。
是的。我们可以先构造一个包含L0
、L1
和L2
:
A = np.array([L0, L1, L2])
接下来我们构造一个S
:
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]]]])
这当然不是我们想要的:我们想要获得一个二维数组。我们可以通过首先转置(或 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]])
因为4
和6
当然取决于L0
、L1
、L2
和S
的维度大小,我们也可以根据那个尺寸来计算它们:
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]])
如果不同构建块的数量 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)))
假设 b = 3
的 S1
的值:
[[3 0 3 3 3 3]
[3 3 3 1 2 3]
[3 3 3 0 3 3]
[2 3 3 3 3 1]]