Python 在scipy中使用tracedot执行一系列外部产品
要在Python中的两个向量(scipy/numpy)之间执行外积,可以使用outer函数,也可以像下面这样简单地使用dot:Python 在scipy中使用tracedot执行一系列外部产品,python,numpy,scipy,linear-algebra,Python,Numpy,Scipy,Linear Algebra,要在Python中的两个向量(scipy/numpy)之间执行外积,可以使用outer函数,也可以像下面这样简单地使用dot: In [76]: dot(rand(2,1), rand(1,2)) Out[76]: array([[ 0.43427387, 0.5700558 ], [ 0.19121408, 0.2509999 ]]) 现在的问题是,假设我有一个向量列表(或两个列表…),我想计算所有的外积,创建一个方阵列表。我怎样才能轻松做到这一点?我相信tensordo
In [76]: dot(rand(2,1), rand(1,2))
Out[76]:
array([[ 0.43427387, 0.5700558 ],
[ 0.19121408, 0.2509999 ]])
现在的问题是,假设我有一个向量列表(或两个列表…),我想计算所有的外积,创建一个方阵列表。我怎样才能轻松做到这一点?我相信tensordot能够做到这一点,但是如何做到呢?第三种(也是最容易概括的)计算外积的方法是通过广播
一些3矢量(行上的矢量):
外部产品:
from numpy import newaxis
xy = x[:,:,newaxis] * y[:,newaxis,:]
# 10th matrix
print xy[10]
print np.outer(x[10,:], y[10,:])
实际上是pv提供的答案。不正确,因为生成的xy阵列将具有形状(100,3,3)。 正确的广播方式如下:
import numpy as np
from numpy import newaxis
x = np.random.randn(100, 3)
y = np.random.randn(100, 3)
xy = x[:,newaxis, :,newaxis] * y[newaxis,:,newaxis,:]
生成的xy阵列现在为形状(100100,3,3),并包含x和y中所有3向量对的叉积:
for i,a in enumerate(x):
for j,b in enumerate(y):
if not np.alltrue(np.outer(a,b) == xy[i,j]): print("The code is wrong")
不提供输出:)如果列表很大,请查看PyTables:您需要计算外积列表,还是只计算它们的和(或其他属性)?@dividebyzero:
创建方阵列表
真的是您的最终目标吗?你能更具体地说明你的目标吗?Thanks@Paulo它们不是很大的列表。。。大约1000个元素。我要找的是最快最简单的计算方法。@Jeremiah我需要这个列表。。。我所做的是从一个图像中计算所谓的结构张量,仅仅是一行图像。这是一个梯度向量的列表,我需要每个向量的外积。稍后我会在三个图像通道上添加其中的一部分,以及顶部和底部线条。但是结果仍然是一个2x2矩阵的列表,图像行的每个像素一个。谢谢你,我不知道这个!。。。但我仍然在寻找一个tensordot实现,以便比较速度!
for i,a in enumerate(x):
for j,b in enumerate(y):
if not np.alltrue(np.outer(a,b) == xy[i,j]): print("The code is wrong")