<p>NumPy数组的维数必须用<a href="https://en.wikipedia.org/wiki/Array_data_structure#Multidimensional_arrays" rel="noreferrer">data structures sense</a>来理解,而不是数学意义上的维数,也就是说,它是获取标量值所需的标量索引的数量。(*)</p>
<p>例如,这是一个三维数组:</p>
<pre><code>>>> X = np.arange(24).reshape(2, 3, 4)
>>> X
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
</code></pre>
<p>索引一次可生成二维数组(矩阵):</p>
<pre><code>>>> X[0]
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
</code></pre>
<p>索引两次给出一维数组(矢量),索引三次给出标量。</p>
<p><code>X</code>的秩是它的维数:</p>
<pre><code>>>> X.ndim
3
>>> np.rank(X)
3
</code></pre>
<p>Axis大致等同于dimension;它用于广播操作:</p>
<pre><code>>>> X.sum(axis=0)
array([[12, 14, 16, 18],
[20, 22, 24, 26],
[28, 30, 32, 34]])
>>> X.sum(axis=1)
array([[12, 15, 18, 21],
[48, 51, 54, 57]])
>>> X.sum(axis=2)
array([[ 6, 22, 38],
[54, 70, 86]])
</code></pre>
<p>老实说,我觉得这个“rank”的定义很混乱,因为它既不匹配属性名<code>ndim</code>,也不匹配属性名<a href="https://en.wikipedia.org/wiki/Rank_%28linear_algebra%29" rel="noreferrer">linear algebra definition of rank</a>。</p>
<p>现在关于<code>np.dot</code>,您需要了解的是,有三种方法可以表示NumPy中的向量:一维数组、形状为<code>(n, 1)</code>的列向量或形状为<code>(1, n)</code>的行向量。(实际上,有更多的方法,例如作为一个<code>(1, n, 1)</code>形状的数组,但这些方法非常少见。)<code>np.dot</code>当两个参数都是1-d时执行向量乘法,当一个参数是1-d而另一个参数是2-d时执行矩阵向量乘法,否则执行(广义)矩阵乘法:</p>
<pre><code>>>> A = np.random.randn(2, 3)
>>> v1d = np.random.randn(2)
>>> np.dot(v1d, A)
array([-0.29269547, -0.52215117, 0.478753 ])
>>> vrow = np.atleast_2d(v1d)
>>> np.dot(vrow, A)
array([[-0.29269547, -0.52215117, 0.478753 ]])
>>> vcol = vrow.T
>>> np.dot(vcol, A)
Traceback (most recent call last):
File "<ipython-input-36-98949c6de990>", line 1, in <module>
np.dot(vcol, A)
ValueError: matrices are not aligned
</code></pre>
<p>规则“在<code>a</code>的最后一个轴上和<code>b</code>的第二个轴上的和积”匹配并推广了矩阵乘法的一般定义。</p>
<p>(*)数组<code>dtype=object</code>有点异常,因为它们将任何Python对象视为标量。</p>