Как добавить элементы в массив NumPy - PullRequest
66 голосов
/ 21 февраля 2011

Мне нужно выполнить следующую задачу:

от

a = array([[1,3,4],[1,2,3]...[1,2,1]])

(добавить один элемент в каждую строку) в:

a = array([[1,3,4,x],[1,2,3,x]...[1,2,1,x]])

Я пытался сделать что-то вроде массива [n] = ([1,3,4, x])

но наглый жаловался на несоответствие формы. Я попытался выполнить итерацию по a и добавить элемент x к каждому элементу, но изменения не отображаются.

Есть идеи, как мне этого добиться?

Ответы [ 7 ]

124 голосов
/ 21 февраля 2011

Добавление данных в существующий массив является естественной вещью, которую нужно сделать для всех, кто имеет опыт работы с Python. Однако, если вы обнаружите, что регулярно добавляете большие массивы, вы быстро обнаружите, что NumPy не так легко и эффективно делает это так, как это делает python list. Вы обнаружите, что каждое действие «добавления» требует перераспределения памяти массива и кратковременного удвоения требований к памяти. Итак, более общее решение проблемы состоит в том, чтобы попытаться выделить массивы так, чтобы они были такими же большими, как конечный результат вашего алгоритма. Затем выполните все свои операции над подмножествами ( ломтики ) этого массива. Создание и уничтожение массива в идеале должно быть сведено к минимуму.

Тем не менее, это часто неизбежно, и функции, которые делают это:

для двумерных массивов:

для трехмерных массивов (вышеуказанный плюс):

для массивов N-D:

13 голосов
/ 21 февраля 2011
import numpy as np
a = np.array([[1,3,4],[1,2,3],[1,2,1]])
b = np.array([10,20,30])
c = np.hstack((a, np.atleast_2d(b).T))

возвращает c:

array([[ 1,  3,  4, 10],
       [ 1,  2,  3, 20],
       [ 1,  2,  1, 30]])
7 голосов
/ 21 февраля 2011

Один из способов сделать это (может быть, не самый лучший) - создать другой массив с новыми элементами и выполнить column_stack. т.е.

>>>a = array([[1,3,4],[1,2,3]...[1,2,1]])
[[1 3 4]
 [1 2 3]
 [1 2 1]]

>>>b = array([1,2,3])
>>>column_stack((a,b))
array([[1, 3, 4, 1],
       [1, 2, 3, 2],
       [1, 2, 1, 3]])
4 голосов
/ 09 июля 2013

Добавление одного скаляра может быть сделано немного проще, как уже показано (а также без преобразования в float), путем расширения скаляра до типа списка python:

import numpy as np
a = np.array([[1,3,4],[1,2,3],[1,2,1]])
x = 10

b = np.hstack ((a, [[x]] * len (a) ))

возвращает b как:

array([[ 1,  3,  4, 10],
       [ 1,  2,  3, 10],
       [ 1,  2,  1, 10]])

Добавление строки может быть сделано:

c = np.vstack ((a, [x] * len (a[0]) ))

возвращает c как:

array([[ 1,  3,  4],
       [ 1,  2,  3],
       [ 1,  2,  1],
       [10, 10, 10]])
1 голос
/ 23 февраля 2019

np.insert также может использоваться для этой цели

import numpy as np
a = np.array([[1, 3, 4],
              [1, 2, 3],
              [1, 2, 1]])
x = 5
index = 3 # the position for x to be inserted before
np.insert(a, index, x, axis=1)
array([[1, 3, 4, 5],
       [1, 2, 3, 5],
       [1, 2, 1, 5]])

index также может быть list / tuple

>>> index = [1, 1, 3] # equivalently (1, 1, 3)
>>> np.insert(a, index, x, axis=1)
array([[1, 5, 5, 3, 4, 5],
       [1, 5, 5, 2, 3, 5],
       [1, 5, 5, 2, 1, 5]])

или slice

>>> index = slice(0, 3)
>>> np.insert(a, index, x, axis=1)
array([[5, 1, 5, 3, 5, 4],
       [5, 1, 5, 2, 5, 3],
       [5, 1, 5, 2, 5, 1]])
1 голос
/ 21 февраля 2011

Если x - это просто одно скалярное значение, вы можете попробовать что-то вроде этого, чтобы гарантировать правильную форму массива, который добавляется / объединяется в крайний правый столбец a:

import numpy as np
a = np.array([[1,3,4],[1,2,3],[1,2,1]])
x = 10
b = np.hstack((a,x*np.ones((a.shape[0],1))))

возвращает b как:

array([[  1.,   3.,   4.,  10.],
       [  1.,   2.,   3.,  10.],
       [  1.,   2.,   1.,  10.]])
0 голосов
/ 18 мая 2015
target = []

for line in a.tolist():
    new_line = line.append(X)
    target.append(new_line)

return array(target)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...