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()。也见此