Python Numpy/Scipy:如何重新构建数据阵列?

Python Numpy/Scipy:如何重新构建数据阵列?,python,numpy,scipy,Python,Numpy,Scipy,我正在处理一个分类问题。 我有一个ndarray形状(604329,33),其中有32个特征和一列标签: >>> n_data.shape (604329, 33) 此数据列的第三列是带有0和1的标签 我需要将第三列作为最后一列移动,以便在需要切片时更容易使用 问题: 有没有办法重建ndarray,将第三列移到最后一列?如果我理解正确,您希望执行以下操作: my_array = numpy.roll(my_array,-3,axis=1) 以下几点可以做到: x =

我正在处理一个分类问题。
我有一个
ndarray
形状
(604329,33)
,其中有32个特征和一列标签:

>>> n_data.shape   
(604329, 33)
此数据列的第三列是带有
0
1
的标签
我需要将第三列作为最后一列移动,以便在需要切片时更容易使用

问题:

有没有办法重建
ndarray
,将第三列移到最后一列?

如果我理解正确,您希望执行以下操作:

my_array = numpy.roll(my_array,-3,axis=1)

以下几点可以做到:

x = np.hstack((x[:,:3],x[:,4:],x[:,3:4]))
如果
x
是您的
ndarray

作为的解决方案的替代方案,您可以直接切片阵列,而无需
hstack

>>> a = numpy.array([range(33) for _ in range(4)])
>>> indices = range(33)
>>> indices.append(indices.pop(3))
>>> a[:,indices]
array([[ 0,  1,  2,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,
        18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,  3],
       [ 0,  1,  2,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,
        18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,  3],
       [ 0,  1,  2,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,
        18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,  3],
       [ 0,  1,  2,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,
        18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,  3]])
对于小型阵列,速度要快一些:

>>> %timeit numpy.hstack((a[:,:3], a[:,4:], a[:, 3:4]))
100000 loops, best of 3: 19.1 us per loop
>>> %timeit indices = range(33); indices.append(indices.pop(3)); a[:,indices]
100000 loops, best of 3: 14 us per loop
但实际上,对于较大的阵列,速度较慢

>>> a = numpy.array([range(33) for _ in range(600000)])
>>> %timeit numpy.hstack((a[:,:3], a[:,4:], a[:, 3:4]))
1 loops, best of 3: 385 ms per loop
>>> %timeit indices = range(33); indices.append(indices.pop(3)); a[:,indices]
1 loops, best of 3: 670 ms per loop
如果您不需要保留列的顺序(即,如果您可以使用
roll
),那么对于大型
a
,的解决方案是最快的:

>>> %timeit numpy.roll(a, -3, axis=1)
10 loops, best of 3: 120 ms per loop