Обмен столбцами в массиве numpy?
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 могут использовать только один() или список newaxes (и один...) как индекс", что означает, что аргументы не являются ints? Я уже пытался преобразовать cols в int, но это не решило его.
Ответы
Ответ 1
Здесь есть две проблемы. Во-первых, 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 базовая разбивка не создает копии фактических данных, а представляет собой представление для одних и тех же данных. Чтобы выполнить эту работу, вам либо нужно явно указать
temp = numpy.copy(my_array[:, 0])
my_array[:, 0] = my_array[:, 1]
my_array[:, 1] = temp
или используйте расширенный срез
my_array[:,[0, 1]] = my_array[:,[1, 0]]
Ответ 2
Я нахожу следующее самое быстрое:
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
Ответ 3
Настройте ответ @Sven:
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]]