4
#these are defined as [a b]
hyperplanes = np.mat([[0.7071,    0.7071, 1], 
                      [-0.7071,   0.7071, 1],
                      [0.7071,   -0.7071, 1],
                      [-0.7071,  -0.7071, 1]]);

a = hyperplanes[:][:,0:2].T;
b = hyperplanes[:,2];

这些表示 [:][:,0:2] 是什么意思?a和b的最终结果是什么?

4

1 回答 1

8

我们可以使用交互式解释器来找出答案。

In [3]: hyperplanes = np.mat([[0.7071,    0.7071, 1], 
   ...:                       [-0.7071,   0.7071, 1],
   ...:                       [0.7071,   -0.7071, 1],
   ...:                       [-0.7071,  -0.7071, 1]])

请注意,Python 中的行尾不需要分号。

In [4]: hyperplanes
Out[4]: 
matrix([[ 0.7071,  0.7071,  1.    ],
        [-0.7071,  0.7071,  1.    ],
        [ 0.7071, -0.7071,  1.    ],
        [-0.7071, -0.7071,  1.    ]])

我们得到一个matrix对象。NumPy 通常使用 an ndarray(你会用上面的np.array代替np.mat),但在这种情况下,无论是矩阵还是ndarray.

让我们看看a

In [7]: hyperplanes[:][:,0:2].T
Out[7]: 
matrix([[ 0.7071, -0.7071,  0.7071, -0.7071],
        [ 0.7071,  0.7071, -0.7071, -0.7071]])

这个切片有点奇怪。请注意:

In [9]: hyperplanes[:]
Out[9]: 
matrix([[ 0.7071,  0.7071,  1.    ],
        [-0.7071,  0.7071,  1.    ],
        [ 0.7071, -0.7071,  1.    ],
        [-0.7071, -0.7071,  1.    ]])

In [20]: np.all(hyperplanes == hyperplanes[:])
Out[20]: True

换句话说,你根本不需要[:]里面。然后,我们剩下hyperplanes[:,0:2].T. [:,0:2]可以简化为,这[:,:2]意味着我们想要获取 中的所有行hyperplanes,但只获取前两列。

In [14]: hyperplanes[:,:2]
Out[14]: 
matrix([[ 0.7071,  0.7071],
        [-0.7071,  0.7071],
        [ 0.7071, -0.7071],
        [-0.7071, -0.7071]])

.T给我们转置。

In [15]: hyperplanes[:,:2].T
Out[15]: 
matrix([[ 0.7071, -0.7071,  0.7071, -0.7071],
        [ 0.7071,  0.7071, -0.7071, -0.7071]])

最后,b = hyperplanes[:,2]给了我们所有的行和第二列。换句话说,第 2 列中的所有元素。

In [21]: hyperplanes[:,2]
Out[21]: 
matrix([[ 1.],
        [ 1.],
        [ 1.],
        [ 1.]])

由于 Python 是一种解释型语言,因此很容易自己尝试并弄清楚发生了什么。将来,如果您遇到困难,请返回解释器并尝试一下——更改一些数字,取消.T等。

于 2013-09-19T03:36:18.697 回答