2012-02-21 103 views
2

我正在处理分类问题。
我有形状(604329, 33)ndarray其中有32个特征和标签一个柱:Numpy/Scipy:如何重建ndarray?

>>> n_data.shape 
(604329, 33) 

此ndarray的第三列是与01标签。
我需要将第三列作为最后一列,以便在需要切片时更容易处理。

问:
有没有办法来重建ndarray我们可以将这个第三列作为最后一列?

回答

2

如果我理解正确的话,你想做的事:

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

下面将做到这一点:

x = np.hstack((x[:,:3],x[:,4:],x[:,3:4])) 

其中x是你ndarray

2

作为aix的解决方案的替代方案,您可以直接切片阵列,而不需要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)然后Mr. E的解决方案是最快的大型a

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