Python 在numpy中使用矩阵的有效方法是什么
假设我有一个numpy矩阵,如:Python 在numpy中使用矩阵的有效方法是什么,python,numpy,Python,Numpy,假设我有一个numpy矩阵,如: In [66]: data = np.arange(6).reshape(2,3) In [67]: data Out[67]: array([[0, 1, 2], [3, 4, 5]]) In [68]: type(data) Out[68]: numpy.ndarray 我想得到数据[0,:].T(它应该是一个3×1的矩阵)和数据[1,:]的乘积(它应该是一个1×3的矩阵),结果应该是3×3的矩阵 因此,我写道: M = np.dot(
In [66]: data = np.arange(6).reshape(2,3)
In [67]: data
Out[67]:
array([[0, 1, 2],
[3, 4, 5]])
In [68]: type(data)
Out[68]: numpy.ndarray
我想得到数据[0,:].T(它应该是一个3×1的矩阵)和数据[1,:]的乘积(它应该是一个1×3的矩阵),结果应该是3×3的矩阵
因此,我写道:
M = np.dot(data[0,:].T, data[1,:])
但这给了我一个数字,而不是3乘3的矩阵
我注意到numpy.ndarray中的切片给了我一个1D数组,因此数据[0,:].T,数据[1,:]都是三元素数组,点积只是元素积的总和
In [92]: data[0,:].T.shape
Out[92]: (3L,)
In [93]: data[1,:].shape
Out[93]: (3L,)
In [94]: np.dot(data[0,:].T, data[1,:])
Out[94]: 14
然后,我发现我可以使用numpy.matrix将数据转换为矩阵场景,然后执行切片和点积,这很有效
然而,我不太确定这种转换的效率。由于我需要处理大规模矩阵,效率是我关心的问题
所以,我的问题是,对于我的情况,在切片上执行点积的最佳方式是什么?1x3和3x1的乘积是1x1,而不是3x3。但是,
data[0,:]
和data[1,:]
都是一维数组,而不是二维矩阵。这是因为严格来说,数据不是矩阵,而是二维数组
如果你想要一个3x3,你必须以另一个顺序(3x1乘以1x3)乘以矩阵。对于如何做到这一点,您有几个选择。一种是使用列表索引以二维数组的形式获取行(一行):
另一种可能是将数据
做成一个numpy矩阵(而不是一个ndarray):
然后,您可以更直接地执行该操作:
>>> data[1, :].T * data[0, :]
matrix([[ 0, 3, 6],
[ 0, 4, 8],
[ 0, 5, 10]])
(请注意,如果使用矩阵,则可以使用*
进行矩阵乘法。)
这是因为numpy矩阵返回矩阵,即使得到的切片可以“压缩”到较低的维度;Ndarray进行压缩,因此从2D数组中获取一行将返回1D数组,而不是1xN数组。1x3和3x1的乘积是1x1,而不是3x3。但是,
data[0,:]
和data[1,:]
都是一维数组,而不是二维矩阵。这是因为严格来说,数据不是矩阵,而是二维数组
如果你想要一个3x3,你必须以另一个顺序(3x1乘以1x3)乘以矩阵。对于如何做到这一点,您有几个选择。一种是使用列表索引以二维数组的形式获取行(一行):
另一种可能是将数据
做成一个numpy矩阵(而不是一个ndarray):
然后,您可以更直接地执行该操作:
>>> data[1, :].T * data[0, :]
matrix([[ 0, 3, 6],
[ 0, 4, 8],
[ 0, 5, 10]])
(请注意,如果使用矩阵,则可以使用*
进行矩阵乘法。)
这是因为numpy矩阵返回矩阵,即使得到的切片可以“压缩”到较低的维度;Ndarray进行压缩,因此从2D数组中获取一行将返回1D数组,而不是1xN数组。1x3和3x1的乘积是1x1,而不是3x3。但是,
data[0,:]
和data[1,:]
都是一维数组,而不是二维矩阵。这是因为严格来说,数据不是矩阵,而是二维数组
如果你想要一个3x3,你必须以另一个顺序(3x1乘以1x3)乘以矩阵。对于如何做到这一点,您有几个选择。一种是使用列表索引以二维数组的形式获取行(一行):
另一种可能是将数据
做成一个numpy矩阵(而不是一个ndarray):
然后,您可以更直接地执行该操作:
>>> data[1, :].T * data[0, :]
matrix([[ 0, 3, 6],
[ 0, 4, 8],
[ 0, 5, 10]])
(请注意,如果使用矩阵,则可以使用*
进行矩阵乘法。)
这是因为numpy矩阵返回矩阵,即使得到的切片可以“压缩”到较低的维度;Ndarray进行压缩,因此从2D数组中获取一行将返回1D数组,而不是1xN数组。1x3和3x1的乘积是1x1,而不是3x3。但是,
data[0,:]
和data[1,:]
都是一维数组,而不是二维矩阵。这是因为严格来说,数据不是矩阵,而是二维数组
如果你想要一个3x3,你必须以另一个顺序(3x1乘以1x3)乘以矩阵。对于如何做到这一点,您有几个选择。一种是使用列表索引以二维数组的形式获取行(一行):
另一种可能是将数据
做成一个numpy矩阵(而不是一个ndarray):
然后,您可以更直接地执行该操作:
>>> data[1, :].T * data[0, :]
matrix([[ 0, 3, 6],
[ 0, 4, 8],
[ 0, 5, 10]])
(请注意,如果使用矩阵,则可以使用*
进行矩阵乘法。)
这是因为numpy矩阵返回矩阵,即使得到的切片可以“压缩”到较低的维度;Ndarray进行压缩,因此从2D数组中获取一行将返回1D数组,而不是1xN数组。1x3和3x1的乘积是1x1,而不是3x3。此外,
数据[0,:]
根本不是矩阵——它的形状是(3,)
。要获得您想要的(外部产品),您需要传递带有形状(3,1)
和(1,3)
的数组。要挑剔一点,您使用的是2d数组。矩阵是不同的数据类型。1x3和3x1的乘积是1x1,而不是3x3。而且,data[0,:]
根本不是矩阵——它的形状是(3,)
。要获得您想要的(外部产品),您需要传递带有形状(3,1)
和(1,3)
的数组。要挑剔一点,您使用的是2d数组。矩阵是不同的数据类型。1x3和3x1的乘积是1x1,而不是3x3。而且,data[0,:]
根本不是矩阵——它的形状是(3,)
。要获得您想要的(外部产品),您需要传递带有形状(3,1)
和(1,3)
的数组。要挑剔更多,您使用