python - 将每列的点积与自身取并存储在新的数组维度中
问题描述
我需要在给定的二维数组中将每列的点积与自身的转置相结合。目前,我正在使用循环,它既慢又丑,所以我想知道如何使用纯数组操作(如果可能)以及例如使用einsum
和类似工具来做到这一点。
MWE:
import numpy as np
A = np.random.randint(2,15,size=(2,3))
>>>A
array([[14, 9, 4],
[12, 8, 2]])
这就是我想要的,包括我目前的做法:
AA = [A[:,i].reshape(-1,1).dot(A[:,i].reshape(-1,1).T) for i in range(3)]
>>>AA
[array([[196, 168],
[168, 144]]),
array([[81, 72],
[72, 64]]),
array([[16, 8],
[ 8, 4]])]
最后
>>>np.stack(AA,axis=0)
array([[[196, 168],
[168, 144]],
[[ 81, 72],
[ 72, 64]],
[[ 16, 8],
[ 8, 4]]])
有形状(3,2,2)
。
现在显然在我真正的问题中,A
是巨大的,所以目前的方法是不可行的。因此,如何才能做得更好?
解决方案
您可以使用numpy.einsum:
import numpy as np
A = np.array([
[14, 9, 4],
[12, 8, 2]
])
np.einsum('ik,jk->kij', A, A)
array([[[196, 168],
[168, 144]],
[[ 81, 72],
[ 72, 64]],
[[ 16, 8],
[ 8, 4]]])
推荐阅读
- python-3.x - Docker 容器中的 Jenkins - 如何安装自定义 Python 库?
- html-lists - li 内联工作,但不是其他方式
- c - 带双指针的指针
- firebase - 无法识别术语别名
- mysql - 连接池 - 什么给了?
- mongodb - mongo-connector 为地理点字段提供 number_format_exception
- vb.net - CH341DLL.DLL + I2C 不能与 VB.NET 一起正常工作
- python - 如何使用python从列表中找到最长的N个单词?
- javascript - Facebook share_open_graph 的大图,可能吗?
- javascript - React 重用具有不同状态的组件