Python 3.x 从4个一维数组创建元组的numpy矩阵

Python 3.x 从4个一维数组创建元组的numpy矩阵,python-3.x,numpy,numpy-ndarray,Python 3.x,Numpy,Numpy Ndarray,假设我有四个一维numpy数组A,B,C,D,我想创建一个矩阵M,这样矩阵的每个条目M[I,j,k,l]就是元组(A,B,C,D) 其中a=a[i],b=b[j],c=c[k]和d=d[d] 如何在没有循环的情况下高效地构建它?您可以创建一个具有正确形状的空数组M(注意最后一个维度中的4,这是您的元组),然后使用广播在M中分配整个行/列 M=np.empty(( 第(一)项、第(二)项、第(三)项、第(四)项、第四项 )) M[…,0]=a[:,无,无,无] M[…,1]=b[无,无,无,无]

假设我有四个一维numpy数组A,B,C,D,我想创建一个矩阵M,这样矩阵的每个条目M[I,j,k,l]就是元组(A,B,C,D)

其中a=a[i],b=b[j],c=c[k]和d=d[d]


如何在没有循环的情况下高效地构建它?

您可以创建一个具有正确形状的空数组
M
(注意最后一个维度中的4,这是您的元组),然后使用广播在
M
中分配整个行/列

M=np.empty((
第(一)项、第(二)项、第(三)项、第(四)项、第四项
))
M[…,0]=a[:,无,无,无]
M[…,1]=b[无,无,无,无]
M[…,2]=c[无,无,:,无]
M[…,3]=d[无,无,无,:]

为什么是元组?这不是一个有效的数组。我想做矢量化;但是由于每个条目都是以条目的索引为条件来决定的——不确定如何做到这一点,我想把它作为一个中间步骤哦,还有一个后续问题:如果我要在这个5D矩阵上应用np.vectorize和一些函数,这将把每个条目作为输入——是否可以排除第五维,以便传递给vectorize的函数可以取而代之地接受4元素元组?
np.vectorize
一直迭代到标量元素级别。它有一个
signature
参数,可能可以做你想做的事情,但速度更慢。
np.vectorize
为你做广播。如果您的函数是
fn(a,b,c,d)
,则矢量化版本可以采用
ffn(a[:,None,None,None],b[…]等)
(与上述扩展数组相同)。但请记住,矢量化并不是一种快速工具;只是为了方便。啊,我明白了——还有别的选择吗?我尝试了
np。沿_轴应用
,速度也很慢。
沿_轴应用
也是一个迭代函数-在除最后一个维度之外的所有维度上迭代。如果您的函数仅适用于1d数组,则必须为较大数组中的每个1d数组调用一次(加上一次尝试调用以确定输出类型/形状)。它调用该函数的次数是1000次,这很慢,而不是迭代机制本身。