Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在numpy中使用矩阵的有效方法是什么_Python_Numpy - Fatal编程技术网

Python 在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(

假设我有一个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(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)
的数组。要挑剔更多,您使用