Допустим, у меня есть массив NumPy a
:
a = np.array([
[1, 2, 3],
[2, 3, 4]
])
И я хотел бы добавить столбец нулей, чтобы получить массив b
:
b = np.array([
[1, 2, 3, 0],
[2, 3, 4, 0]
])
Как я могу сделать это легко в NumPy?
a = np.random.rand((N,N))
наa = np.random.rand(N,N)
np.r_[ ... ]
иnp.c_[ ... ]
являются полезными альтернативамиvstack
иhstack
, с квадратными скобками [] вместо round ().Пара примеров:
(Причина, по которой квадратные скобки [] вместо round () заключаются в том, что Python расширяется, например, в 1: 4 в квадрат - чудеса перегрузки.)
источник
np.c_[ * iterable ]
; см. списки выражений .Используйте
numpy.append
:источник
append
на самом деле просто звонитconcatenate
Одним из способов использования hstack является:
источник
dtype
параметр, он не нужен и даже не разрешен. Хотя ваше решение достаточно элегантно, обратите внимание, чтобы не использовать его, если вам нужно часто «добавлять» в массив. Если вы не можете создать весь массив сразу и заполнить его позже, создайте список массивов иhstack
все сразу.Я считаю следующие самые элегантные:
Преимущество
insert
заключается в том, что он также позволяет вставлять столбцы (или строки) в других местах массива. Также вместо вставки одного значения вы можете легко вставить целый вектор, например, дублировать последний столбец:Что приводит к:
По срокам,
insert
может быть медленнее, чем решение JoshAdel:источник
insert(a, -1, ...)
чтобы добавить колонку. Думаю, я просто добавлю это вместо этого.a.shape[axis]
. И. е. для добавления строки, вы делаете,np.insert(a, a.shape[0], 999, axis=0)
и для столбца, вы делаетеnp.insert(a, a.shape[1], 999, axis=1)
.Я тоже интересовался этим вопросом и сравнил скорость
которые все делают то же самое для любого входного вектора
a
. Сроки выращиванияa
:Обратите внимание, что все несмежные варианты (в частности
stack
/vstack
) в конечном итоге быстрее, чем все смежные варианты.column_stack
(для его ясности и скорости), кажется, хороший вариант, если вам требуется смежность.Код для воспроизведения сюжета:
источник
stack
,hstack
,vstack
,column_stack
,dstack
все вспомогательные функции , построенные на вершинеnp.concatenate
. Просматривая определение стека, я обнаружил, чтоnp.stack([a,a])
это вызовnp.concatenate([a[None], a[None]], axis=0)
. Было бы неплохо добавитьnp.concatenate([a[None], a[None]], axis=0).T
в perfplot, чтобы показать, что онnp.concatenate
всегда может быть по крайней мере так же быстр, как его вспомогательные функции.c_
иcolumn_stack
Думаю:
более элегантно
источник
np.concatenate также работает
источник
np.concatenate
кажется, в 3 раза быстрее, чемnp.hstack
для матриц 2x1, 2x2 и 2x3.np.concatenate
было также немного быстрее, чем копировать матрицы вручную в пустую матрицу в моих экспериментах. Это согласуется с ответом Нико Шлёмера ниже.Предполагая
M
, что (100,3) ndarray иy
(100,) ndarrayappend
можно использовать следующим образом:Хитрость заключается в использовании
Это преобразуется
y
в (100, 1) 2D массив.сейчас дает
источник
Мне нравится ответ JoshAdel из-за сосредоточенности на производительности. Незначительное улучшение производительности состоит в том, чтобы избежать затрат на инициализацию с нулями, только для перезаписи. Это имеет измеримую разницу, когда N велико, вместо нулей используется пустое, а столбец нулей записывается как отдельный шаг:
источник
b[:,-1] = 0
. Кроме того, с очень большими массивами разница в производительностиnp.insert()
становится незначительной, что может бытьnp.insert()
более желательным из-за ее краткости.np.insert
также служит цели.Здесь он вставляет значения здесь
new_col
, перед данным индексом, здесьidx
вдоль одной оси. Другими словами, вновь вставленные значения будут заниматьidx
столбец и перемещать то, что было изначально в и после,idx
назад.источник
insert
это не так, как можно предположить, учитывая имя функции (см. Документы в ответе).Добавьте дополнительный столбец в массив numpy:
Метод Numpy
np.append
принимает три параметра, первые два - это двумерные массивы, а третий - параметр оси, указывающий, к какой оси добавить:Печать:
источник
Немного опоздал на вечеринку, но никто еще не опубликовал этот ответ, поэтому для полноты картины: вы можете сделать это с помощью списочных представлений в простом массиве Python:
источник
Для меня следующий путь выглядит довольно интуитивно и просто.
источник
В моем случае мне пришлось добавить столбец единиц в массив NumPy
После X.shape => (97, 2)
источник
Специально для этого есть функция. Это называется numpy.pad
Вот что написано в строке документации:
источник