numpy: замена значений в массиве - PullRequest
3 голосов
/ 07 июня 2011

Я довольно новичок в numpy и пытаюсь заменить значение в повторном массиве.Итак, у меня есть этот массив:

import numpy as np
d = [('1', ''),('4', '5'),('7', '8')]
a = np.array(d, dtype=[('first', 'a5'), ('second', 'a5')])

Я хотел бы сделать что-то вроде этого:

ind = a=='' #Replace all blanks
a[ind] = '12345'

, но это не работает должным образом.Я был в состоянии сделать это:

col = a['second']
ind = col=='' #Replace all blanks
col[ind] = '54321'
a['second'] = col

Что работает, но я бы предпочел сделать это по всему массиву повторов.У кого-нибудь есть лучшее решение?

Ответы [ 2 ]

5 голосов
/ 07 июня 2011

Операции numpy «элемент за элементом» (с помощью которых вы можете выполнять некоторую функцию сразу для всех элементов массива без цикла), насколько я знаю, не работают с обработчиками.Вы можете сделать это только с отдельными столбцами.

Если вы хотите использовать повторные массивы, я думаю, что самое простое решение состоит в том, чтобы зациклить разные столбцы, хотя вы хотели другое решение, но вы можете сделать это довольно автоматически, как это:

for fieldname in a.dtype.names:
    ind = a[fieldname] == ''
    a[fieldname][ind] = '54321'

Но, может быть, вам стоит подумать, действительно ли вам нужны переопределения, и вы не можете просто использовать обычный ndarray.Конечно, если у вас есть только один тип данных (как в примере), то единственным преимуществом являются имена столбцов.

0 голосов
/ 07 июня 2011

Одно из возможных решений:

a[np.where(a['second']=='')[0][0]]['second']='12345'
...