Обмен столбцами в массиве 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, но это не решило его.

3 Solutions collect form web for “Обмен столбцами в массиве numpy?”

Здесь есть два вопроса. Во-первых, 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]] 

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

 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 

Основываясь на ответе @ Свена:

 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]] 
  • как интерпретировать значения numpy.correlate и numpy.corrcoef?
  • Как создать массив записей numpy из C
  • Установка scipy в Python 3.5 на 32-разрядной машине Windows 7
  • Высокопроизводительный массив означает
  • Как найти скалярный продукт матрицы Numpy?
  • Matplotlib исчерпывает память при построении графика в цикле
  • нет модуля с именем numpy python2.7
  • Как вставить массивы в базу данных?
  • Какой самый быстрый способ разрезать матрицу scipy.sparse?
  • очищающие элементы массива numpy
  • Поврежденное изображение сохраняется с помощью PIL
  • Python - лучший язык программирования в мире.