Как добавить строки в массив NumPy?
У меня есть массив A:
A = array([[0, 1, 2], [0, 2, 0]])
Я хочу добавить строки в этот массив из другого массива X, если первый элемент каждой строки в X соответствует определенному условию.
В массивах Numpy нет метода «добавления», подобного спискам, или так кажется.
Если бы А и Х были списками, я бы просто сделал:
for i in X:
if i[0] < 3:
A.append(i)
Есть ли numpythonic способ сделать эквивалент?
Спасибо, S ;-)
Ответы:
Что такое
X
? Если это 2D-массив, как вы можете сравнить его строку с числомi < 3
:?РЕДАКТИРОВАТЬ после комментария OP:
добавить ко
A
всем строкамX
откуда первый элемент< 3
:источник
A
. Очевидно, что для небольшой проблемы, как в этом ответе, это не проблема, но она может быть более сложной для больших данных.ну, вы можете сделать это:
источник
Так как этот вопрос был 7 лет назад, в последней версии, которую я использую, это numpy версия 1.13 и python3, я делаю то же самое, добавляя строку в матрицу, не забудьте поставить двойную скобку во второй аргумент, в противном случае это приведет к ошибке измерения.
Здесь я добавляю на матрицу А
с рядом
такое же использование в
np.r_
Просто чтобы кто-то заинтересовался, если вы хотите добавить столбец,
array = np.c_[A,np.zeros(#A's row size)]
следуя тому, что мы делали раньше на матрице А, добавив к ней столбец
источник
Если после каждой строки вычисления не требуются, гораздо быстрее добавить строки в python, а затем преобразовать в numpy. Вот временные тесты, использующие python 3.6 против numpy 1.14, по 100 строк, по одной за раз:
Итак, простое решение исходного вопроса, которое было семь лет назад, заключается в использовании vstack () для добавления новой строки после преобразования строки в массив numpy. Но более реалистичное решение должно учитывать низкую производительность vstack в этих условиях. Если вам не нужно выполнять анализ данных в массиве после каждого добавления, лучше буферизовать новые строки в список строк Python (список списков, на самом деле) и добавить их как группу в массив numpy использование vstack () перед выполнением любого анализа данных.
источник
Вы также можете сделать это:
источник
np.concatenate((A,newrow), axis=0)
1.12.1
(и в Python 3), это похоже на попытку конкатенировать вектор с повышением матрицыValueError: all the input arrays must have same number of dimensions
. Похоже, что он хочет, чтобы вектор был явно преобразован в вектор столбца или строки, прежде чем он захочет объединить его.newrow = [[1,2,3]]
источник
Если вы можете сделать конструкцию за одну операцию, то что-то вроде ответа vstack-with-fancy-indexing - хороший подход. Но если ваше состояние более сложное или строки появляются на лету, вы можете увеличить массив. Фактически, numpythonic способ сделать что-то вроде этого - динамически увеличивать массив - это динамически увеличивать список:
Списки высоко оптимизированы для такого типа шаблона доступа; у вас нет удобной многомерной индексации в виде списка, но пока вы добавляете, трудно сделать лучше, чем список массивов строк.
источник
Я использую 'np.vstack', который быстрее, EX:
источник
Вы можете использовать,
numpy.append()
чтобы добавить строку в массив numpty и изменить форму матрицы позже.источник