我有一个形状为 (3,2) 的数组:
import numpy as np
arr = np.array([[0.,0.],[0.25,-0.125],[0.5,-0.125]])
我试图构建一个维度为 (6,2) 的矩阵(矩阵),其结果是 arr 的元素 i,i 的外积和arr.T。目前我正在使用 for 循环,例如:
size = np.shape(arr)
matrix = np.zeros((size[0]*size[1],size[1]))
for i in range(np.shape(arr)[0]):
prod = np.outer(arr[i],arr[i].T)
matrix[size[1]*i:size[1]+size[1]*i,:] = prod
结果:
matrix =array([[ 0. , 0. ],
[ 0. , 0. ],
[ 0.0625 , -0.03125 ],
[-0.03125 , 0.015625],
[ 0.25 , -0.0625 ],
[-0.0625 , 0.015625]])
有没有办法在不使用 for 循环(例如广播)的情况下构建这个矩阵?
最佳答案
使用 None/np.newaxis
将数组扩展到 3D
保持第一个轴对齐,同时让第二个轴成对相乘,利用 broadcasting
执行乘法并 reshape 为2D
-
matrix = (arr[:,None,:]*arr[:,:,None]).reshape(-1,arr.shape[1])
我们还可以使用np.einsum
-
matrix = np.einsum('ij,ik->ijk',arr,arr).reshape(-1,arr.shape[1])
einsum
字符串表示可能更直观,因为它让我们可视化三件事:
对齐的轴(此处 axis=0)。
正在汇总的轴(此处没有)。
保留的轴,即按元素相乘(此处 axis=1)。
关于python - 避免使用 for 循环。 python 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47464227/