В качестве альтернативы решению 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