Numpy:将一个矩阵与一组向量相乘
我很难进入numpy。我最终想要的是一个由矩阵变换的向量的简单抖动图。我读过很多次只是使用矩阵的数组,足够公平。我已经得到了X一meshgrid和y坐标Numpy:将一个矩阵与一组向量相乘
X,Y = np.meshgrid(np.arange(0,10,2),np.arange(0,10,1))
a = np.array([[1,0],[0,1.1]])
但即使是谷歌搜索,并尝试了两个多小时后,我无法摆脱的a
矩阵乘法而且每个向量的所得载体。我知道颤抖将分量长度作为输入,所以进入颤抖函数的结果向量应该是类似于x分量的np.dot(a, [X[i,j], Y[i,j]]) - X[i,j]
,其中i和j遍历范围。
我当然可以在循环中编程,但numpy有很多内建工具可以使这些向量化的东西得心应手,我相信有更好的方法。
编辑:好的,这里是循环版本。
import numpy as np
import matplotlib.pyplot as plt
plt.figure(figsize=(10,10))
n=10
X,Y = np.meshgrid(np.arange(-5,5),np.arange(-5,5))
print("val test", X[5,3])
a = np.array([[0.5,0],[0,1.3]])
U = np.zeros((n,n))
V = np.zeros((n,n))
for i in range(10):
for j in range(10):
product = np.dot(a, [X[i,j], Y[i,j]]) #matrix with vector
U[i,j] = product[0]-X[i,j] # have to substract the position since quiver accepts magnitudes
V[i,j] = product[1]-Y[i,j]
Q = plt.quiver(X,Y, U, V)
您可以做矩阵乘法“手动”使用NumPy的广播是这样的:
import numpy as np
import matplotlib.pyplot as plt
X,Y = np.meshgrid(np.arange(-5,5), np.arange(-5,5))
a = np.array([[0.5, 0], [0, 1.3]])
U = (a[0,0] - 1)*X + a[0,1]*Y
V = a[1,0]*X + (a[1,1] - 1)*Y
Q = plt.quiver(X, Y, U, V)
,或者如果你想使用np.dot
你必须汇整X
和Y
阵列,并将它们结合起来,适当的形状如下:
import numpy as np
import matplotlib.pyplot as plt
X,Y = np.meshgrid(np.arange(-5,5), np.arange(-5,5))
a = np.array([[0.5, 0], [0, 1.3]])
U,V = np.dot(a-np.eye(2), [X.ravel(), Y.ravel()])
Q = plt.quiver(X, Y, U, V)
我一直在努力解决同一个问题,并最终使用numpy.matrix类。考虑下面的例子。
import numpy as np
>>> transformation_matrix = np.array([(1, 0, 0, 1),
... (0, 1, 0, 0),
... (0, 0, 1, 0),
... (0, 0, 0, 1)])
>>> coordinates = np.array([(0,0,0),
... (1,0,0)])
>>> coordinates = np.hstack((coordinates, np.ones((len(coordinates), 1))))
>>> coordinates
array([[ 0., 0., 0., 0.],
[ 1., 0., 0., 0.]])
在这种情况下,numpy.matrix类帮助。以下代码通过将坐标转置为列向量以及numpy.matrix类的指定矩阵乘法超载来给出预期结果。
>>> (np.asmatrix(transformation_matrix) * np.asmatrix(coordinates).T).T
matrix([[ 1., 0., 0., 1.],
[ 2., 0., 0., 1.]])
作为docs says,多维数据np.mul
(或@
)工作在以下方式:
对于N维它结束的最后一个轴和第二到和积b的-last:
dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m])
这不是我们想在这里。但是,有一些简单的替代方案不涉及平展 - 解压或手动矩阵乘法:np.tensordot
和np.einsum
。
第一种是直接从the docs采取了一个例子:
做最左边的指标,而不是最右边的一个矩阵,矩阵的产品,你可以做
np.einsum('ij...,jk...->ik...', a, b)
。
import numpy as np
import matplotlib.pyplot as plt
X,Y = np.meshgrid(np.arange(-5,5), np.arange(-5,5))
a = np.array([[0.5, 0], [0, 1.3]])
U, V = np.einsum('ij...,jk...->ik...', a - np.eye(2), np.array([X, Y]))
Q = plt.quiver(X, Y, U, V)
第二种是简单np.tensordot
应用。我们只是教它将第一个参数的第二个轴(colums)和第一个参数的第一个轴(行)相加。
import numpy as np
import matplotlib.pyplot as plt
X,Y = np.meshgrid(np.arange(-5,5), np.arange(-5,5))
a = np.array([[0.5, 0], [0, 1.3]])
U, V = np.tensordot(a - np.eye(2), np.array([X, Y]), axes=(1, 0))
plt.quiver(X, Y, U, V)
你期望结果看起来像什么? a.shape =(2,2),X.shape =(10,5),Y.shape =(10,5)'。我没有明白你的观点... – jkalden 2014-11-24 13:46:45
你可以在循环中显示一个简单的版本(以便更容易地计算出你正在尝试做什么)? – atomh33ls 2014-11-24 13:51:04
完成。这实际上只是一个矢量场的矩阵,并且结果通过颤动箭头可视化 – Basti 2014-11-24 14:03:32