Как добавить строки в массив numpy?
У меня есть массив A:
A = array([[0, 1, 2], [0, 2, 0]])
Я хочу добавить строки в этот массив из другого массива X, если первый элемент каждой строки в X удовлетворяет определенному условию.
В массивах Numpy нет метода 'append', как у списков, или, как кажется.
Если A и X были списками, я бы просто сделал:
for i in X:
if i[0] < 3:
A.append(i)
Существует ли numpythonic способ сделать эквивалент?
Спасибо,
S; -)
Ответ 1
Что такое X
? Если это 2D-массив, как вы можете сравнить его строку с числом: i < 3
?
ИЗМЕНИТЬ после комментария OP:
A = array([[0, 1, 2], [0, 2, 0]])
X = array([[0, 1, 2], [1, 2, 0], [2, 1, 2], [3, 2, 0]])
добавить в A
все строки из X
, где первый элемент < 3
:
A = vstack((A, X[X[:,0] < 3]))
# returns:
array([[0, 1, 2],
[0, 2, 0],
[0, 1, 2],
[1, 2, 0],
[2, 1, 2]])
Ответ 2
well u может сделать это:
newrow = [1,2,3]
A = numpy.vstack([A, newrow])
Ответ 3
Поскольку этот вопрос задавался 7 годами ранее, в последней версии, которую я использую, это numpy версия 1.13 и python3, я делаю то же самое, добавляя строку в матрицу, не забудьте поставить двойную скобку во второй аргумент, в противном случае это вызовет ошибку измерения.
Здесь я добавляю на матрицу А
1 2 3
4 5 6
с рядом
7 8 9
такое же использование в np.r_
A= [[1, 2, 3], [4, 5, 6]]
np.append(A, [[7, 8, 9]], axis=0)
>> array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
#or
np.r_[A,[[7,8,9]]]
Просто чтобы кто-то заинтересовался, если вы хотите добавить столбец,
array = np.c_[A,np.zeros(#A row size)]
следуя тому, что мы делали раньше на матрице А, добавив к ней столбец
np.c_[A, [2,8]]
>> array([[1, 2, 3, 2],
[4, 5, 6, 8]])
Ответ 4
Вы также можете сделать это:
newrow = [1,2,3]
A = numpy.concatenate((A,newrow))
Ответ 5
Если после каждой строки вычисления не требуются, гораздо быстрее добавить строки в python, а затем преобразовать в numpy. Вот временные тесты, использующие python 3.6 против numpy 1.14, по 100 строк, по одной за раз:
import numpy as py
from time import perf_counter, sleep
def time_it():
# Compare performance of two methods for adding rows to numpy array
py_array = [[0, 1, 2], [0, 2, 0]]
py_row = [4, 5, 6]
numpy_array = np.array(py_array)
numpy_row = np.array([4,5,6])
n_loops = 100
start_clock = perf_counter()
for count in range(0, n_loops):
numpy_array = np.vstack([numpy_array, numpy_row]) # 5.8 micros
duration = perf_counter() - start_clock
print('numpy 1.14 takes {:.3f} micros per row'.format(duration * 1e6 / n_loops))
start_clock = perf_counter()
for count in range(0, n_loops):
py_array.append(py_row) # .15 micros
numpy_array = np.array(py_array) # 43.9 micros
duration = perf_counter() - start_clock
print('python 3.6 takes {:.3f} micros per row'.format(duration * 1e6 / n_loops))
sleep(15)
#time_it() prints:
numpy 1.14 takes 5.971 micros per row
python 3.6 takes 0.694 micros per row
Итак, простое решение первоначального вопроса, которое было семь лет назад, заключается в использовании vstack() для добавления новой строки после преобразования строки в массив numpy. Но более реалистичное решение должно учитывать низкую производительность vstack в этих условиях. Если вам не нужно запускать анализ данных в массиве после каждого добавления, лучше буферизовать новые строки в список строк Python (действительно, список списков) и добавить их как группу в массив numpy использование vstack() перед выполнением любого анализа данных.
Ответ 6
import numpy as np
array_ = np.array([[1,2,3]])
add_row = np.array([[4,5,6]])
array_ = np.concatenate((array_, add_row), axis=0)
Ответ 7
Я использую 'np.vstack', который быстрее, EX:
import numpy as np
input_array=np.array([1,2,3])
new_row= np.array([4,5,6])
new_array=np.vstack([input_array, new_row])
Ответ 8
Если вы можете сделать конструкцию за одну операцию, то что-то вроде ответа vstack-with-fancy-indexing - прекрасный подход. Но если ваше состояние более сложное или ваши ряды входят на лету, вы можете захотеть увеличить массив. На самом деле numpythonic способ сделать что-то вроде этого - динамически увеличить массив - это динамически вырастить список:
A = np.array([[1,2,3],[4,5,6]])
Alist = [r for r in A]
for i in range(100):
newrow = np.arange(3)+i
if i%5:
Alist.append(newrow)
A = np.array(Alist)
del Alist
Списки высоко оптимизированы для такого типа шаблонов доступа; у вас нет удобного многомерного индексирования в виде списка, но пока вы добавляете его трудно сделать лучше, чем список массивов строк.
Ответ 9
Вы можете использовать numpy.append()
для добавления строки к массиву numpty и последующего преобразования в матрицу.
import numpy as np
a = np.array([1,2])
a = np.append(a, [3,4])
print a
# [1,2,3,4]
# in your example
A = [1,2]
for row in X:
A = np.append(A, row)