numpy: синтаксис / идиома для приведения массива (n,) к массиву (n, 1)? - PullRequest
6 голосов
/ 03 октября 2011

Я бы хотел отлить обнаженный объект ndarray формы ( n ,) в объект, имеющий форму ( n , 1). Лучшее, что я придумал, - это свернуть мою собственную функцию _to_col:

def _to_col(a):
    return a.reshape((a.size, 1))

Но мне трудно поверить, что такая вездесущая операция еще не встроена в синтаксис numpy. Я полагаю, что я просто не смог найти правильный поиск Google, чтобы найти его.

Ответы [ 2 ]

10 голосов
/ 03 октября 2011

Я бы использовал следующее:

a[:,np.newaxis]

Альтернативный (но, возможно, немного менее понятный) способ написать то же самое:

a[:,None]

Все вышеперечисленное (включая вашу версию) - операции в постоянном времени.

2 голосов
/ 05 октября 2011

np.expand_dims - мой фаворит, когда я хочу добавить произвольную ось.

Нет или np.newaxis подходит для кода, который не должен иметь гибкую ось. (ответ Экс)

>>> np.expand_dims(np.arange(5), 0).shape
(1, 5)
>>> np.expand_dims(np.arange(5), 1).shape
(5, 1)

пример использования: деформировать массив по любой заданной оси

>>> x = np.random.randn(4,5)
>>> x - x.mean(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: shape mismatch: objects cannot be broadcast to a single shape


>>> ax = 1
>>> x - np.expand_dims(x.mean(ax), ax)
array([[-0.04152658,  0.4229244 , -0.91990969,  0.91270622, -0.37419434],
       [ 0.60757566,  1.09020783, -0.87167478, -0.22299015, -0.60311856],
       [ 0.60015774, -0.12358954,  0.33523495, -1.1414706 ,  0.32966745],
       [-1.91919832,  0.28125008, -0.30916116,  1.85416974,  0.09293965]])
>>> ax = 0
>>> x - np.expand_dims(x.mean(ax), ax)
array([[ 0.15469413,  0.01319904, -0.47055919,  0.57007525, -0.22754506],
       [ 0.70385617,  0.58054228, -0.52226447, -0.66556131, -0.55640947],
       [ 1.05009459, -0.27959876,  1.03830159, -1.23038543,  0.73003287],
       [-1.90864489, -0.31414256, -0.04547794,  1.32587149,  0.05392166]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...