【问题标题】:Avoid using for loop. Python 3避免使用 for 循环。蟒蛇 3
【发布时间】:2017-11-23 22:52:07
【问题描述】:

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

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

我试图构建一个维度为 (6,2) 的矩阵 (matrix),其结果是 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 循环(例如广播)的情况下构建这个 矩阵?

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    使用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)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-28
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 2018-05-26
      • 2018-06-17
      • 2019-05-19
      • 1970-01-01
      相关资源
      最近更新 更多