Создайте новый столбец в массиве Python на основе значений, рассчитанных в коде

В настоящее время у меня есть массив, отформатированный следующим образом: arr = [(1,1),(1,1)...(35,1),(35,1)])

Я написал код, который вычисляет третье значение для каждой упорядоченной пары в массиве, по одному. Как я могу создать новый столбец, в котором каждое вычисленное значение будет храниться как новый столбец в моем массиве?


person n1932    schedule 17.07.2015    source источник
comment
Является ли arr массивом NumPy? Или список Python? Другими словами, что возвращает type(arr)?   -  person tsroten    schedule 17.07.2015
comment
Дубликат: Как добавить столбец в массив numpy. Взгляните на numpy.concatenate.   -  person tsroten    schedule 17.07.2015
comment
Я уже смотрел на это, но я не был уверен, работает ли это со значениями, которые вычислялись в моем коде.   -  person n1932    schedule 17.07.2015
comment
Просто создайте массив с вычисленными значениями. Затем соедините два массива вместе. Убедитесь, что вы объединяете, используя правильную ось.   -  person tsroten    schedule 17.07.2015


Ответы (3)


Кортежи неизменяемы, поэтому вы не можете их напрямую изменить. К счастью, вы можете объединить с ними другой кортеж. Предположим, у вас есть массив:

arr = [(1, 2), (3, 4), (5, 6)]

и вы хотите добавить некоторое целое число к каждому кортежу, скажем, индекс кортежа в arr просто для простоты. То есть вы хотите, чтобы окончательный список был:

arr = [(1, 2, 0), (3, 4, 1), (5, 6, 2)]

Следующий код сделает именно это:

arr = [item + (a.index(item),) for item in arr]

Обратите внимание, что запятая и круглые скобки в (a.index(item),) имеют решающее значение для формирования кортежа, а не целого числа. (Вы можете только конкатенировать кортежи с другими кортежами.) Поэтому, если вы просто хотите добавить число к определенному кортежу, попробуйте:

arr[0] += (3,)

который добавит 3 в конец первого элемента в arr. Это позволит вам выполнять такую ​​конкатенацию в любом цикле, генерирующем третью точку, которая, как вы говорите, происходит по одной за раз. Удачного кодирования!

person dpwilson    schedule 17.07.2015

альтернативное решение, просто замените кортежи по ходу дела.

for i in range(len(arr)):
    arr[i] = (arr[i][0], arr[i][1], arr[i][0] * arr[i][1])
person ate50eggs    schedule 17.07.2015

Array formated as arr = [(1,1),(1,1)...(35,1),(35,1)] может сбивать с толку. Похоже на list из tuples. Если это так, вам нужно использовать понимание списка, чтобы создать новый список:

arr1 = [(i,j, fun(i,j)) for i,j in arr]

e.g.

In [359]: arr=[(1,1),(1,2),(35,1),(35,2)]
In [360]: [(i[0],i[1], sum(i)) for i  in arr]
Out[360]: [(1, 1, 2), (1, 2, 3), (35, 1, 36), (35, 2, 37)]

Но вы говорите в комментарии, что arr - это пустой массив.

In [361]: Arr=np.array(arr)    
In [362]: Arr
Out[362]: 
array([[ 1,  1],
       [ 1,  2],
       [35,  1],
       [35,  2]])

Те же числа, но они отображаются в виде списка списков. Массив, который отображается в виде списка кортежей, является структурированным массивом с другим dtype.

Является ли функция чем-то, что может принять весь этот массив, или она должна передавать значения 2 на 2?

np.sum берет весь массив и может вернуть двумерный результат:

In [366]: np.sum(Arr, axis=1, keepdims=True)
Out[366]: 
array([[ 2],
       [ 3],
       [36],
       [37]])

который можно легко объединить с Arr, получив новый массив:

In [370]: np.concatenate([Arr,np.sum(Arr, axis=1, keepdims=True)],axis=1)
Out[370]: 
array([[ 1,  1,  2],
       [ 1,  2,  3],
       [35,  1, 36],
       [35,  2, 37]])

С другой стороны, Python sum просто принимает числа. Arr можно использовать в понимании так же, как список:

In [371]: [sum(i) for i  in Arr]
Out[371]: [2, 3, 36, 37]

Чтобы соединить это с оригиналом, мне нужно превратить его в двумерный «вертикальный» массив (как показано в Out[366]).

In [376]: np.concatenate([Arr,np.array([sum(i) for i in Arr])[:,None]],axis=1)
Out[376]: 
array([[ 1,  1,  2],
       [ 1,  2,  3],
       [35,  1, 36],
       [35,  2, 37]])

append, vstack, hstack — все это вариации concatenate. Вы также можете создать массив (4,3) и вставить значения Arr и новый расчет.

person hpaulj    schedule 17.07.2015