Индексирование одномерного numpy.array как матрицы - PullRequest
7 голосов
/ 17 января 2011

Я пытаюсь индексировать numpy.array с различными размерами во время выполнения. Например, чтобы получить первую строку массива n * m a, вы можете просто сделать

a[0,:]

Однако, если случается, что вектор 1xn , этот код выше возвращает ошибку индекса:

IndexError: слишком много индексов

Поскольку код должен выполняться максимально эффективно, я не хочу вводить оператор if. У кого-нибудь есть удобное решение, которое в идеале не предполагает изменения каких-либо типов структуры данных?

Ответы [ 2 ]

9 голосов
/ 17 января 2011

Просто используйте a[0] вместо a[0,:].Он вернет первую строку для матрицы и первую запись для вектора.Это то, что вы ищете?

Если вы хотите получить весь вектор в одномерном случае, вы можете использовать numpy.atleast_2d(a)[0].Он не скопирует ваш вектор - он просто получит к нему доступ в виде двумерного массива 1 x n.

1 голос
/ 17 января 2011

Из «массива» или «матрицы»?Что я должен использовать? раздел Numpy для пользователей Matlab вики-страница:

Для массива все векторные фигуры 1xN, Nx1 и N - это всеразные вещи.Операции типа A [:, 1] возвращают массив ранга 1 формы N, а не ранг 2 формы Nx1.Транспонирование в массиве ранга 1. ничего не делает.

Вот пример, показывающий, что они не совпадают:

>>> import numpy as np
>>> a1 = np.array([1,2,3])
>>> a1
array([1, 2, 3])
>>> a2 = np.array([[1,2,3]])    // Notice the two sets of brackets
>>> a2
array([[1, 2, 3]])
>>> a3 = np.array([[1],[2],[3]])
>>> a3
array([[1],
       [2],
       [3]])

Итак, вы уверены, что все ваши массивы2D-массивы, или некоторые из них являются 1d-массивами?

Если вы хотите использовать команду array[0,:], я бы порекомендовал на самом деле использовать 1xN 2d-массивы вместо 1d-массивов.Вот пример:

>>> a2 = np.array([[1,2,3]])    // Notice the two sets of brackets
>>> a2
array([[1, 2, 3]])
>>> a2[0,:]
array([1, 2, 3])
>>> b2 = np.array([[1,2,3],[4,5,6]])
>>> b2
array([[1, 2, 3],
       [4, 5, 6]])
>>> b2[0,:]
array([1, 2, 3])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...