将numpy切片拼凑成原始阵列

时间:2017-12-08 20:51:56

标签: python arrays numpy slice

如果使用这样的切片分割numpy数组:

假设数据如下所示:     [[Y X X X ....]     [Y X X X ....]]

X_test = data_test[:, 1:]
y_test = data_test[:, 0]

我认为这样可行但我在这个过程中找不到文档。

test_assembled = [:, y_test:X_test]

2 个答案:

答案 0 :(得分:2)

使用

X_test = data_test[:, 1:]
y_test = data_test[:, 0]

X_testy_test的更改将在data_test中看到。因此,您不需要重新组合它们来传播更改。它们是views

使用np.concatante(或其衍生物,stackc_等)的程序集将生成一个具有自己的数据缓冲区的新数组。这可能是,也可能不是你想要的。

在这种情况下,关于连接它们的唯一棘手的部分是X_test是2d,而y_test(用标量索引)是1d。连接必须考虑到这一点。

是明确的方法
y_temp = y_test[:,None]
new_data = np.concatenate((y_temp, X_test), axis=1)

np.column_stackc_是方便功能,可为您执行y_temp步骤。

同样好的是建立一个空白'接收器数组,并使用相同的切片表示法复制数组。

new_data = np.zeros_like(data_test)
new_data[:, 1:] = X_test
new_data[:,0] = y_test

事实上你可以对data_test进行分配,但是没有必要这样做。

验证

In [135]: data_test = np.arange(12).reshape(3,4)
In [136]: data_test
Out[136]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
In [137]: X_test = data_test[:,1:]
In [139]: y_test = data_test[:,0]
In [140]: y_test
Out[140]: array([0, 4, 8])
In [141]: y_test *= 10
In [142]: data_test
Out[142]: 
array([[ 0,  1,  2,  3],
       [40,  5,  6,  7],
       [80,  9, 10, 11]])
In [143]: np.concatenate((y_test[:,None], X_test), axis=1)
Out[143]: 
array([[ 0,  1,  2,  3],
       [40,  5,  6,  7],
       [80,  9, 10, 11]])
In [144]: np.column_stack((y_test, X_test))
Out[144]: 
array([[ 0,  1,  2,  3],
       [40,  5,  6,  7],
       [80,  9, 10, 11]])
In [145]: new = np.zeros_like(data_test)
In [146]: new[:,1:] = X_test
In [147]: new[:,0] = y_test/10
In [148]: new
Out[148]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

答案 1 :(得分:0)

在这种情况下,您可以使用np.c_

a = np.identity(4)
x, y = a[:,0], a[:,1:]
np.c_[x,y]
# array([[ 1.,  0.,  0.,  0.],
#        [ 0.,  1.,  0.,  0.],
#        [ 0.,  0.,  1.,  0.],
#        [ 0.,  0.,  0.,  1.]])

np.c_可以方便地处理"缺失维度"在a[:,0]为你。