Поменять местами столбцы в массиве numpy? - PullRequest
46 голосов
/ 01 февраля 2011
from numpy import *
def swap_columns(my_array, col1, col2):
    temp = my_array[:,col1]
    my_array[:,col1] = my_array[:,col2]
    my_array[:,col2] = temp

Тогда

swap_columns(data, 0, 1)

Не работает. Однако, вызывая код напрямую

temp = my_array[:,0]
my_array[:,0] = my_array[:,1]
my_array[:,1] = temp

ли. Почему это происходит и как я могу это исправить? Ошибка говорит: «IndexError: 0-d массивы могут использовать только один () или список новых осей (и один ...) в качестве индекса», что означает, что аргументы не являются целыми числами? Я уже пытался преобразовать столбцы в int, но это не помогло.

Ответы [ 4 ]

91 голосов
/ 01 февраля 2011

Здесь есть две проблемы.Первое состоит в том, что data, который вы передаете своей функции, по-видимому, не является двумерным массивом NumPy - по крайней мере, это то, о чем говорится в сообщении об ошибке.делайте то, что ожидаете:

my_array = numpy.arange(9).reshape(3, 3)
# array([[0, 1, 2],
#        [3, 4, 5],
#        [6, 7, 8]])
temp = my_array[:, 0]
my_array[:, 0] = my_array[:, 1]
my_array[:, 1] = temp
# array([[1, 1, 2],
#        [4, 4, 5],
#        [7, 7, 8]])

Проблема в том, что Numpy basic slicing не создает копии фактических данных, а скорее просматривает те же данные.Чтобы сделать это, вам нужно либо явно скопировать

temp = numpy.copy(my_array[:, 0])
my_array[:, 0] = my_array[:, 1]
my_array[:, 1] = temp

, либо использовать расширенную нарезку

my_array[:,[0, 1]] = my_array[:,[1, 0]]
24 голосов
/ 27 октября 2015

Я считаю следующие самые быстрые:

my_array[:, 0], my_array[:, 1] = my_array[:, 1], my_array[:, 0].copy()

Анализ времени:

import numpy as np
my_array = np.arange(900).reshape(30, 30)

выглядит следующим образом:

%timeit my_array[:, 0], my_array[:, 1] = my_array[:, 1], my_array[:, 0].copy()
The slowest run took 15.05 times longer than the fastest. This could mean that an intermediate result is being cached 
1000000 loops, best of 3: 1.72 µs per loop

Расширенное время нарезки:

%timeit my_array[:,[0, 1]] = my_array[:,[1, 0]]
The slowest run took 7.38 times longer than the fastest. This could mean that an intermediate result is being cached 
100000 loops, best of 3: 6.9 µs per loop
13 голосов
/ 27 ноября 2014

Построение на @ ответ Свена:

import numpy as np
my_array = np.arange(9).reshape(3, 3)
print my_array

[[0 1 2]
 [3 4 5]
 [6 7 8]]

def swap_cols(arr, frm, to):
    arr[:,[frm, to]] = arr[:,[to, frm]]

swap_cols(my_array, 0, 1)
print my_array

[[1 0 2]
 [4 3 5]
 [7 6 8]]

def swap_rows(arr, frm, to):
    arr[[frm, to],:] = arr[[to, frm],:]

my_array = np.arange(9).reshape(3, 3)
swap_rows(my_array, 0, 2)
print my_array

[[6 7 8]
 [3 4 5]
 [0 1 2]]
7 голосов
/ 17 мая 2018

Предположим, у вас есть такой массив:

array([[ 0., -1.,  0.,  0.],
       [ 0.,  1.,  1.,  1.],
       [ 0.,  0., -1.,  0.],
       [ 0.,  0.,  0., -1.]])

Это очень элегантный способ поменять столбцы:

col1 = 0
col2 = 1    
my_array.T[[col1, col2]] = my_array.T[[col2, col1]]

Результат:

array([[-1.,  0.,  0.,  0.],
       [ 1.,  0.,  1.,  1.],
       [ 0.,  0., -1.,  0.],
       [ 0.,  0.,  0., -1.]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...