Numpy 将一维阵列填充到三维阵列矢量化
我有一个函数Numpy 将一维阵列填充到三维阵列矢量化,numpy,matrix,multidimensional-array,vectorization,array-broadcasting,Numpy,Matrix,Multidimensional Array,Vectorization,Array Broadcasting,我有一个函数init_tensor(),它将二维矩阵(N,N)广播到三维块矩阵dim(M,N,N),这样就有M个矩阵NXN: def init_tensor(input_state, sample_size): return np.broadcast_to(input_state, (sample_size,)+input_state.shape) 例如,如果我想创建3(4x4)个矩阵,那么我可以: init_tensor(np.eye(4, dtype=complex), 3) Ou
init_tensor()
,它将二维矩阵(N,N)
广播到三维块矩阵dim(M,N,N)
,这样就有M个矩阵NXN
:
def init_tensor(input_state, sample_size):
return np.broadcast_to(input_state, (sample_size,)+input_state.shape)
例如,如果我想创建3(4x4)个矩阵,那么我可以:
init_tensor(np.eye(4, dtype=complex), 3)
Out[462]:
array([[[1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j],
[0.+0.j, 1.+0.j, 0.+0.j, 0.+0.j],
[0.+0.j, 0.+0.j, 1.+0.j, 0.+0.j],
[0.+0.j, 0.+0.j, 0.+0.j, 1.+0.j]],
[[1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j],
[0.+0.j, 1.+0.j, 0.+0.j, 0.+0.j],
[0.+0.j, 0.+0.j, 1.+0.j, 0.+0.j],
[0.+0.j, 0.+0.j, 0.+0.j, 1.+0.j]],
[[1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j],
[0.+0.j, 1.+0.j, 0.+0.j, 0.+0.j],
[0.+0.j, 0.+0.j, 1.+0.j, 0.+0.j],
[0.+0.j, 0.+0.j, 0.+0.j, 1.+0.j]]])
我的问题是,我有一些dim(1,M)的数组,我想将其填充到3D数组中作为其元素。对于一个简单的例子,如果M为3,我有:
lambda1 = [l11,l12,l13]
lambda2 = [l21,l22,l23]
lambda3 = [l31,l32,l33]
tau1 = [t11,t12,t13]
tau2 = [t21,t22,t23]
tau3 = [t31,t32,t33]
我想要一个向量化的方法,我可以把它们填入张量,这样它就变成:
array([[[1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j],
[ t11, l11, 0.+0.j, 0.+0.j],
[ t21, 0.+0.j, l21, 0.+0.j],
[ t31, 0.+0.j, 0.+0.j, l31]],
[[1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j],
[ t12, l12, 0.+0.j, 0.+0.j],
[ t22, 0.+0.j, l22, 0.+0.j],
[ t32, 0.+0.j, 0.+0.j, l32]],
[[1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j],
[ t13, l13, 0.+0.j, 0.+0.j],
[ t23, 0.+0.j, l23, 0.+0.j],
[ t33, 0.+0.j, 0.+0.j, l33]]])
张量矩阵的深度将始终与1D数组的长度相同,
M
的值可以在1到100之间变化。您可以使用numpys
获得此结果:
将numpy导入为np
m=3
n=4
arr=np.one((m,n,n),dtype=int)
lmbda=10*np.arange(1,(n-1)**2+1)。重塑(n-1,n-1)
#lmbda=[[l11、l12、l13]
#[l21、l22、l23]
#[l31、l32、l33]]
#数组([[10,20,30],
# [40, 50, 60],
# [70, 80, 90]])
tau=-10*np.arange(1,(n-1)**2+1)。重塑(n-1,n-1)
#数组([-10,-20,-30],
# [-40, -50, -60],
# [-70, -80, -90]])
arr[:,范围(1,n),范围(1,n)]=lmbda.T
arr[:,range(1,n),0]=tau.T#arr[:,1:,0]=tau.T#备选方案
#数组([[1,1,1,1],
# [-10, 10, 1, 1],
# [-40, 1, 40, 1],
# [-70, 1, 1, 70]],
# [[ 1, 1, 1, 1],
# [-20, 20, 1, 1],
# [-50, 1, 50, 1],
# [-80, 1, 1, 80]],
# [[ 1, 1, 1, 1],
# [-30, 30, 1, 1],
# [-60, 1, 60, 1],
# [-90, 1, 1, 90]]])
您可以使用numpys
获得此结果:
将numpy导入为np
m=3
n=4
arr=np.one((m,n,n),dtype=int)
lmbda=10*np.arange(1,(n-1)**2+1)。重塑(n-1,n-1)
#lmbda=[[l11、l12、l13]
#[l21、l22、l23]
#[l31、l32、l33]]
#数组([[10,20,30],
# [40, 50, 60],
# [70, 80, 90]])
tau=-10*np.arange(1,(n-1)**2+1)。重塑(n-1,n-1)
#数组([-10,-20,-30],
# [-40, -50, -60],
# [-70, -80, -90]])
arr[:,范围(1,n),范围(1,n)]=lmbda.T
arr[:,range(1,n),0]=tau.T#arr[:,1:,0]=tau.T#备选方案
#数组([[1,1,1,1],
# [-10, 10, 1, 1],
# [-40, 1, 40, 1],
# [-70, 1, 1, 70]],
# [[ 1, 1, 1, 1],
# [-20, 20, 1, 1],
# [-50, 1, 50, 1],
# [-80, 1, 1, 80]],
# [[ 1, 1, 1, 1],
# [-30, 30, 1, 1],
# [-60, 1, 60, 1],
# [-90, 1, 1, 90]]])
如果您删除了复合体
将更容易可视化您试图做的事情。有一组np.tri*
函数用于访问和填充上下三角形。如果您删除复合体
将更容易可视化您试图做的事情。有一组np.tri*
用于访问和填充上下三角形的函数。你的方法与生成张量的方式很奇怪,但当我对我的方法进行相同操作时,它给出了值错误:赋值目的地是只读的,你是如何生成数组的。可能使用`arr=arr.copy()。你的方法生成张量的方式很奇怪,但当我用我的方法生成张量时,它给出了ValueError:assignment destination是只读的,你生成数组的方式是什么。可能使用`arr=arr.copy()。也见此