np.c_ 是另一种进行数组连接的方式
In [701]: np.c_[np.array([[1,2,3]]), 0, 0, np.array([[4,5,6]])]
Out[701]: array([[1, 2, 3, 0, 0, 4, 5, 6]])
In [702]: np.concatenate([np.array([[1,2,3]]), [[0]], [[0]], np.array([[4,5,6]])],
axis=1)
Out[702]: array([[1, 2, 3, 0, 0, 4, 5, 6]])
两种情况下的输出形状都是(1,8);连接在轴 = 1 上,即第二轴。
c_ 负责将0 的维度扩展到np.array([[0]]),即需要连接的2d (1,1)。
np.c_(和np.r_)实际上是一个带有__getitem__ 方法的类对象,所以它使用[] 语法。 numpy/lib/index_tricks.py 源文件具有指导意义。
请注意,row 版本使用 : 切片语法,生成一个 1d (8,) 数组(相同的数字,但在 1d 中)
In [706]: np.r_[1:4,0,0,4:7]
Out[706]: array([1, 2, 3, 0, 0, 4, 5, 6])
In [708]: np.concatenate((np.arange(4),[0],[0],np.arange(4,7)))
Out[708]: array([0, 1, 2, 3, 0, 0, 4, 5, 6])
In [710]: np.hstack((np.arange(4),0,0,np.arange(4,7)))
Out[710]: array([0, 1, 2, 3, 0, 0, 4, 5, 6])
np.c_ 是一种方便,但不是您必须理解的。我认为能够直接使用concatenate 更有用。它迫使您明确考虑输入的维度。
[[1,2,3]] 实际上是一个列表——一个包含一个列表的列表。 np.array([[1,2,3]]) 是一个形状为 (1,3) 的二维数组。 np.arange(1,4) 产生一个具有相同数字的 (3,) 数组。 np.arange(1,4)[None,:] 使其成为 (1,3) 数组。
slice(1,4) 是一个切片对象。 np.r_ 和 np.c_ 可以将切片对象转换为数组 - 通过实际使用 np.arange。
In [713]: slice(1,4)
Out[713]: slice(1, 4, None)
In [714]: np.r_[slice(1,4)]
Out[714]: array([1, 2, 3])
In [715]: np.c_[slice(1,4)] # (3,1) array
Out[715]:
array([[1],
[2],
[3]])
In [716]: np.c_[1:4] # equivalent with the : notation
Out[716]:
array([[1],
[2],
[3]])
回到最初的例子(这可能不是最好的):
In [722]: np.c_[[np.r_[1:4]],0,0,[np.r_[4:7]]]
Out[722]: array([[1, 2, 3, 0, 0, 4, 5, 6]])
===========
In [731]: np.c_[np.ones((5,3)),np.random.randn(5,10)].shape
Out[731]: (5, 13)
对于np.c_,两者的第一个维度需要匹配。
在learn 示例中,n_samples 是X(行)的第一个暗点,randn 也需要有那么多行。
n_samples, n_features = X.shape
X = np.c_[X, random_state.randn(n_samples, 200 * n_features)]
np.concatenate([(X, randn(n_samples...)], axis=1) 在这里应该也能正常工作。有点啰嗦,但功能相同。