为何Numpy中[]与[[]]运算结果不同?附实例疑问
Numpy数组维度与矩阵乘法常见疑问解答
问题1:为什么np.dot(l.T,l)和np.dot(s.T,s)结果不同?
先看你的代码:
import numpy as np l = np.array([1,-2.6]) s = np.array([[1,-2.6]]) l_result = np.dot(l.T,l) s_result = np.dot(s.T,s) print(l_result, s_result)
输出是7.76和[[ 1. -2.6] [-2.6 6.76]],本质原因是一维数组和二维数组在Numpy中的行为差异:
l是一维数组,形状为(2,)。Numpy的一维数组没有“行向量”或“列向量”的概念,所以l.T的形状依然是(2,)(转置对一维数组无效)。np.dot(l.T, l)计算的是向量点积,也就是对应元素相乘后求和:1*1 + (-2.6)*(-2.6) = 1 + 6.76 = 7.76,结果是一个标量。s是二维数组,形状为(1,2)(可以理解为一行两列的矩阵)。s.T会转置成形状(2,1)的二维数组(两行一列的矩阵)。np.dot(s.T, s)执行的是矩阵乘法:(2,1)的矩阵乘以(1,2)的矩阵,得到(2,2)的矩阵,每个元素是对应行和列的点积,也就是你看到的结果。
如果想让l的运算也得到矩阵结果,可以把l转换成二维数组,比如l = np.array([[1,-2.6]]),或者用l.reshape(1,2),这样l.T就是(2,1),np.dot(l.T,l)就会和s的结果一致。
问题2:为什么s[0,:]输出没有外层[]?
你的数组定义:
s = np.array([[ 1., -2.6], [-1., 0.4], [-1., -0.6], [ 0., 2.4], [ 1., 0.4]] )
s是一个形状为(5,2)的二维数组。当你用s[0,:]提取第一行时,Numpy默认会降维:把二维数组的单行转化为一维数组(形状从(1,2)变成(2,)),所以输出是[1. -2.6],没有外层的[]。
如果想保持二维结构(即输出带外层[]),可以用以下两种方式:
- 用索引数组取行:
s[[0], :],结果形状是(1,2),输出为[[1. -2.6]] - 用切片:
s[0:1, :],同样得到形状(1,2)的二维数组
内容的提问来源于stack exchange,提问作者Yograj Singh Mandloi
相关产品推荐
相关产品推荐

