Добавление дополнительного столбца в 2D-массив numpy python

У меня есть двумерный массив numpy, который имеет форму (867, 43). Моя цель — добавить дополнительный столбец (значение np.nan) в качестве ведущего столбца в этот массив, чтобы форма стала (867, 44).

Примером может быть:

# sub-section of array
>>> arr[:2, :5]

array([[-0.30368954,  2.8808107 ,  5.8833385 ,  8.6606045 , 11.242557  ],
       [-0.22719575,  3.0030012 ,  6.065371  ,  8.924864  , 11.561942  ]],
  dtype=float32)

превратится в:

# same sub-section
>>> f[:2,:5]

array([[        nan, -0.30368954,  2.8808107 ,  5.8833385 ,  8.6606045 ],
       [        nan, -0.22719575,  3.0030012 ,  6.065371  ,  8.924864  ]],
  dtype=float32)

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


person Max Collier    schedule 13.12.2018    source источник


Ответы (3)


Вы можете использовать np.hstack():

import numpy as np

my_arr = np.array([[-0.30368954,  2.8808107 ,  5.8833385 ,  8.6606045 , 11.242557  ],
                [-0.22719575,  3.0030012 ,  6.065371  ,  8.924864  , 11.561942  ]])

col = np.empty((my_arr.shape[0],1))
col[:] = np.nan
np.hstack((col, my_arr))

Возвращает:

[[        nan -0.30368954  2.8808107   5.8833385   8.6606045  11.242557  ]
 [        nan -0.22719575  3.0030012   6.065371    8.924864   11.561942  ]]
person rahlf23    schedule 13.12.2018

Взгляните на стек. Изменить: уточнение; Я использую функцию трансляции чтобы вставить новую ось вдоль второго измерения, а затем hstack добавит ось вдоль нулевой оси (по умолчанию для hstack используются строки или первое измерение).

from numpy import array, hstack, nan, newaxis
a = array([[-0.30368954,  2.8808107 ,  5.8833385 ,  8.6606045 , 11.242557  ],
       [-0.22719575,  3.0030012 ,  6.065371  ,  8.924864  , 11.561942  ]],
  dtype=float32)

tmp = ones((a.shape[0])) * nan # create nan array
print(hstack((tmp[:, newaxis], a))) # append along zero axis 

Выход:

[[        nan -0.30368954  2.88081074  5.88333845  8.66060448 11.24255657]
 [        nan -0.22719575  3.00300121  6.06537104  8.92486382 11.5619421 ]]
person cvanelteren    schedule 13.12.2018
comment
это работает! Однако я уверен, что был бы способ сделать это, что более ясно для того, что происходит... Я пытаюсь понять, смогу ли я заставить numpy.insert работать в одной строке, но у меня его нет работать еще.. - person Max Collier; 13.12.2018
comment
добавил еще немного информации для вас! И почистил его нужным массивом nan. Либо используя newaxis, либо None. Это эквивалентно указанию 1 в форме метода единиц. - person cvanelteren; 13.12.2018

Использование np.insert()

>>> import numpy as np
>>> arr
array([[-0.30368954,  2.8808107 ,  5.8833385 ,  8.6606045 , 11.242557  ],
       [-0.22719575,  3.0030012 ,  6.065371  ,  8.924864  , 11.561942  ]],

>>> arr = np.insert(arr, 0, np.nan, axis=0)
>>> arr
array([[        nan, -0.30368954,  2.8808107 ,  5.8833385 ,  8.6606045 , 11.242557  ],
       [        nan, -0.22719575,  3.0030012 ,  6.065371  ,  8.924864  , 11.561942  ]],
person Max Collier    schedule 13.12.2018
comment
Ницца! Не знал про вставку. Обычно для всего этого используется стек. Каждый день узнавать что-то новое - person cvanelteren; 13.12.2018
comment
Без проблем! Ваш пример стека должен был стать моим запасным вариантом. Спасибо за помощь! - person Max Collier; 13.12.2018