避免使用for循环。 Python 3

时间:2017-11-23 22:52:08

标签: python arrays numpy

我有一个形状数组(3,2):

import numpy as np
arr = np.array([[0.,0.],[0.25,-0.125],[0.5,-0.125]])

我正在尝试构建一个维度(6,2)的矩阵( 矩阵 ),其结果是元素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循环(例如广播)的情况下构建 矩阵

1 个答案:

答案 0 :(得分:3)

使用None/np.newaxis将数组扩展到3D,保持第一个轴对齐,同时让第二个轴成对倍增,执行乘法运算broadcasting并重新转换为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字符串表示可能更直观,因为它让我们可以看到三件事:

  • 对齐的轴(此处为轴= 0)。

  • 总结的轴(此处没有)。

  • 保持的轴,即按元素乘以(此处轴= 1)。