Numpy Array Column Slicing создает IndexError: недопустимое исключение индекса - PullRequest
6 голосов
/ 17 августа 2011

Я использую numpy версии 1.5.1 и Python 2.6.6.

Я читаю двоичный файл в массив numpy:

>>> dt = np.dtype('<u4,<i2,<i2,<i2,<i2,<i2,<i2,<i2,<i2,u1,u1,u1,u1')
>>> file_data = np.fromfile(os.path.join(folder,f), dtype=dt)

Это прекрасно работает.Рассматривая результат:

>>> type(file_data)
<type 'numpy.ndarray'>

>>> file_data
array([(3571121L, -54, 103, 1, 50, 48, 469, 588, -10, 0, 102, 0, 0),
   (3571122L, -78, 20, 25, 45, 44, 495, 397, -211, 0, 102, 0, 0),
   (3571123L, -69, -48, 23, 60, 19, 317, -26, -151, 0, 102, 0, 0), ...,
   (3691138L, -53, 52, -2, -11, 76, 988, 288, -101, 1, 102, 0, 0),
   (3691139L, -11, 21, -27, 25, 47, 986, 253, 176, 1, 102, 0, 0),
   (3691140L, -30, -19, -63, 59, 12, 729, 23, 302, 1, 102, 0, 0)],
  dtype=[('f0', '<u4'), ('f1', '<i2'), ('f2', '<i2'), ... , ('f12', '|u1')])

>>> file_data[0]
(3571121L, -54, 103, 1, 50, 48, 469, 588, -10, 0, 102, 0, 0)

>>> file_data[0][0]
3571121    

>>> len(file_data)
120020

Когда я пытаюсь нарезать первый столбец:

>>> file_data[:,0]

, я получаю:

IndexError: invalid index.

Я смотрел на простые примеры исмог сделать нарезку:

>>> a = np.array([(1,2,3),(4,5,6)])
>>> a[:,0]
array([1, 4])

Единственное отличие, которое я вижу между моим делом и простым примером, состоит в том, что я использую dtype.Что я делаю не так?

1 Ответ

15 голосов
/ 17 августа 2011

Когда вы устанавливаете dtype таким образом, вы создаете Record Array .Numpy рассматривает это как одномерный массив элементов вашего dtype.Существует принципиальная разница между

file_data[0][0]

и

file_data[0,0] 

. В первом случае вы запрашиваете первый элемент одномерного массива, а затем извлекаете первый элемент этого возвращенного элемента.Во втором вы запрашиваете элемент в первой строке первого столбца двумерного массива.Вот почему вы получаете IndexError.

. Если вы хотите получить доступ к отдельному элементу с помощью двумерной нотации, вы можете создать представление и работать с ним.К сожалению, AFAIK, если вы хотите обрабатывать свой объект как двумерный массив, все элементы должны иметь одинаковый тип d.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...