python - 避免使用 for 循环。 python 3

标签 python arrays numpy

我有一个形状为 (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/

相关文章:

python - 在 numpy/scipy 中用随机数初始化一个 float32 矩阵

c - 在C中按结构排序数组

python - Numpy 整数除法在转换时有时会产生错误的结果

python - 无法弄清楚如何使用Python SDK修改Azure负载均衡器后端池

python - 错误: can't chdir to 'app' when using docker start container

c - 从c中的.txt文件读取二维字符串数组

c - while 循环中的 Free()

接受 numpy ndarray 或序列作为参数的 Python 函数

python - 在 Python 中评估极坐标网格上的插值函数的最快方法是什么?

python - 如何在 Django Rest Framework 中对外部 API 进行分页