Python 为什么在二维阵列的Numpy切片中使用负索引?

Python 为什么在二维阵列的Numpy切片中使用负索引?,python,numpy,linear-regression,Python,Numpy,Linear Regression,我试图理解一个Udacity线性回归示例,其中包括: data = np.loadtxt('data.csv',delimiter=',') # This is known to be a 2-columns, many rows array X = data[:,:-1] y = data[:,-1] 因此,如果我理解,X是一个单列数组,它捕获了数据的所有列,但最后一列除外(实际上只捕获第一列),y是一个单列数组,只捕获数据的最后一列 我的问题是为什么不这样写代码: X = data[:,0

我试图理解一个Udacity线性回归示例,其中包括:

data = np.loadtxt('data.csv',delimiter=',') # This is known to be a 2-columns, many rows array
X = data[:,:-1]
y = data[:,-1]
因此,如果我理解,
X
是一个单列数组,它捕获了
数据的所有列,但最后一列除外(实际上只捕获第一列),
y
是一个单列数组,只捕获
数据的最后一列

我的问题是为什么不这样写代码:

X = data[:,0]
y = data[:,1]

它不是更清晰/更清晰吗?

X
是一个
(n,1)
2D数组,因为切片保留了维度。另一种措辞是

X = data[:, :1]
X = data[:, 0, None]
X = data[:, 0].reshape(-1, 1)
y
是一个
(n,)
1D数组


这些形状对于用于实现回归的线性代数可能很重要。

制作一个自己的小测试数组,并检查结果。你确定
数据
总是(n,2)形状吗?
数据[:,:-1]
是二维数组,
数据[:,0]
是一维数组。回归需要一个2D数组。@hpaulj-该示例只允许使用(n,2)形数组。当然,我认为它们可以生成一个不同形状的数组,但是没有理由将相关列放在索引1和-1处……使用
X
y
表明
X
应该是一个(n,m)数组,而
y
a(n,)
X
将是具有
m
特征和
y
标签的数据。这是机器学习中常见的分裂。我们必须看看用这些变量来扩展的代码,我不明白。X和y都是1列X多行,对吗?你是说尽管如此,他们在本质上还是不同的吗?@JDelage<代码>y
不是一列。广播到2D将使其成为n列,一行。另一个关于形状的例子是,如果将一对2D数组传递给
numpy.dot
,如果形状不完全正确,它们将引发错误。你需要追溯这些量是用来理解形状的用途的。好了,我现在明白了:我的命题改变了矩阵的形状。在给定的示例中,X是一个1列X多行数组,而我提出的结果是一个简单的1D数组(向量)。元素是相同的,但形状不同,显然这很关键。@JDelage。确切地此外,广播在右侧排列维度,因此在某些情况下,
Y
将被视为行向量。但是,例如,
np.dot
,会根据1D数组是第一个参数还是第二个参数而对其进行不同的处理。还有其他一些奇怪的情况,但正如你所说的,尺寸是至关重要的。