Доступ к столбцам массива Numpy? Ошибки, пытающиеся выполнить транспонирование или доступ по столбцам

У меня есть numpy.ndarray столбцы, к которым я хотел бы получить доступ. Я буду брать все столбцы после 8 и тестировать их для отклонения, удаляя столбец, если дисперсия / среднее значение невелико. Для этого мне нужен доступ к столбцам, желательно с помощью Numpy. По моим текущим методам я сталкиваюсь с ошибками или невозможностью транспонирования.

Чтобы использовать эти массивы, я использую адаптер IOPro, который дает обычный numpy.ndarray.

import iopro import sys adapter = iopro.text_adapter(sys.argv[1], parser='csv') all_data = adapter[:] z_matrix = adapter[range(8,len(all_data[0]))][1:3] print type(z_matrix) #check type print z_matrix # print array print z_matrix.transpose() # attempt transpose (fails) print z_matrix[:,0] # attempt access by column (fails) 

Может кто-нибудь объяснить, что происходит?

Вывод:

 <type 'numpy.ndarray'> [ (18.712, 64.903, -10.205, -1.346, 0.319, -0.654, 1.52398, 114.495, -75.2488, 1.52184, 111.31, 175. 408, 1.52256, 111.699, -128.141, 1.49227, 111.985, -138.173) (17.679, 48.015, -3.152, 0.848, 1.239, -0.3, 1.52975, 113.963, -50.0622, 1.52708, 112.335, -57.4621 , 1.52603, 111.685, -161.098, 1.49204, 113.406, -66.5854)] [ (18.712, 64.903, -10.205, -1.346, 0.319, -0.654, 1.52398, 114.495, -75.2488, 1.52184, 111.31, 175. 408, 1.52256, 111.699, -128.141, 1.49227, 111.985, -138.173) (17.679, 48.015, -3.152, 0.848, 1.239, -0.3, 1.52975, 113.963, -50.0622, 1.52708, 112.335, -57.4621 , 1.52603, 111.685, -161.098, 1.49204, 113.406, -66.5854)] Traceback (most recent call last): File "z-matrix-filtering.py", line 11, in <module> print z_matrix[:,0] IndexError: too many indices 

Что происходит не так? Есть ли лучший способ доступа к столбцам? Я буду читать все строки файла, тестируя все столбцы с 8-го по значимой дисперсии, удаляя любые столбцы, которые не сильно различаются, а затем перепечатывают результат как новый CSV.

EDIT: Основываясь на ответах, я создал следующее очень уродливое, и я думаю, что это глупый подход.

 all_data = adapter[:] z_matrix = [] for line in all_data: to_append = [] for column in range(8,len(all_data.dtype)): to_append.append(line[column].astype(np.float16)) z_matrix.append(to_append) z_matrix = np.array(z_matrix) 

Причина, по которой столбцы должны иметь прямой доступ, заключается в том, что внутри данных есть строка. Если эта строка не обходится каким-либо образом, будет возникать ошибка в отношении массива void с элементами-членами, использующими ошибку буфера. Есть ли лучшее решение? Это кажется ужасным, и кажется, что это будет неэффективно для нескольких гигабайт данных.

3 Solutions collect form web for “Доступ к столбцам массива Numpy? Ошибки, пытающиеся выполнить транспонирование или доступ по столбцам”

Обратите внимание, что вывод print z_matrix имеет вид

 [ (18.712, 64.903, ..., -138.173) (17.679, 48.015, ..., -66.5854)] 

То есть, он печатается как список кортежей. Это результат, который вы получаете, когда массив является «структурированным массивом». Это одномерный массив структур. Каждый «элемент» в массиве имеет 18 полей. Ошибка возникает из-за того, что вы пытаетесь индексировать 1-D массив, как если бы он был 2-D; z_matrix[:,0] не будет работать.

Распечатайте тип данных массива, чтобы просмотреть детали. Например

 print z_matrix.dtype 

Это должно указывать имена полей и их отдельных типов данных.

Вы можете получить один из элементов, например, z_matrix[k] (где k – целое число), или вы можете получить доступ к столбцу (действительно поле структурированного массива) как z_matrix['name'] (изменить 'name' в одно из полей в dtype).

Если все поля имеют одинаковый тип данных (это похоже на случай здесь – каждое поле имеет тип np.float64 ), вы можете создать двухмерное представление данных, изменив результат метода представления. Например:

 z_2d = z_matrix.view(np.float64).reshape(-1, len(z_matrix.dtype.names)) 

Другой способ получить данные по номеру столбца, а не по имени:

 col = 8 # The column number (zero-based). col_data = z_matrix[z_matrix.dtype.names[col]] 

Дополнительные сведения о структурированных массивах см. По адресу http://docs.scipy.org/doc/numpy/user/basics.rec.html .

Дисплей z_matrix согласуется с тем, что он является формой (2,) , 1-м массивом кортежей.

 np.array([np.array(a) for a in z_matrix]) 

производит массив (2,18) 2d. Вы должны быть в состоянии выполнить свои тесты столбцов.

Очень легко получить доступ к массиву numpy. Вот простой пример, который может быть полезен

 import numpy as n A = n.array([[1, 2, 3], [4, 5, 6]]) print A >>> array([[1, 2, 3], [5, 6, 7]]) AT // To obtain the transpose >>> array([[1, 5], [2, 6], [3, 7]]) n.mean(AT, axis = 1) // To obtain column wise mean of array A >>> array([ 3., 4., 5.]) 

Надеюсь, это поможет вам выполнить операции транспонирования и столбцов

  • Поиск индексов в списках Python эффективно (по сравнению с MATLAB)
  • Уменьшение размеров матрицы при маскировании
  • Как хранить широкие таблицы в pytables / hdf5
  • Случайный модуль Python, сделанный недоступным случайным модулем Numpy
  • умножьте каждый элемент на numpy.array a с каждым элементом в numpy.array b
  • Изменение размера и растяжения массива NumPy
  • Ошибка импорта scipy.sparse
  • Поднять до 1/3 дает комплексное число
  • Python - лучший язык программирования в мире.