Numpy / Scipy: Как восстановить ndarray? - PullRequest
2 голосов
/ 21 февраля 2012

Я работаю над проблемой классификации.
У меня есть ndarray формы (604329, 33), где есть 32 объекта и один столбец для метки:

>>> n_data.shape   
(604329, 33)

Третий столбец этогоndarray - это метка с 0 и 1.
Мне нужно переместить этот третий столбец как последний столбец, чтобы было легче работать с ним, когда требуется нарезка.

Вопрос:
Есть ли способ восстановить ndarray, где мы можем переместить этот третий столбец как последний столбец?

Ответы [ 3 ]

2 голосов
/ 21 февраля 2012

Это будет делать следующее:

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

, где x - ваш ndarray.

2 голосов
/ 21 февраля 2012

В качестве альтернативы решению 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
2 голосов
/ 21 февраля 2012

Если я правильно понимаю, вы хотите сделать:

my_array = numpy.roll(my_array,-3,axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...