В numpy, как я могу назначить массив размера N для большего массива с логической маской - PullRequest
1 голос
/ 22 марта 2012

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

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

a = np.array([(0,0,0),
       (1,0,0),
       (2,1,0),
       (3,1,0),
       (4,1,0),
       (5,0,0),
       (6,0,0),
       (7,0,0),
       (8,1,0),
       (9,1,0)], 
       dtype=np.dtype([('time', '<i4'), ('ena', '|b1'), ('elapsed', '<i4')]))

Чтобы рассчитать разницу во времени с предыдущими немаскированными записями:

elapsed =  a[a['ena']]['timestamp'][1:] - a[a['ena']]['timestamp'][0:-1]

истекло будет [1,1,4,1], (что я и хотел). Теперь я хочу записать прошедшие секунды в исходный массив:

a[a['ena']]['step_secs'][1:] = timestep

нет предупреждения или ошибки, но a остается неизменным, хотя я ожидал:

a = np.array([
       (0,0,0),
       (1,0,0),
       (2,1,0),
       (3,1,1),
       (4,1,1),
       (5,0,0),
       (6,0,0),
       (7,0,0),
       (8,1,4),
       (9,1,1)]

Как мне это сделать? Большое спасибо.

1 Ответ

1 голос
/ 22 марта 2012

Обалденные люди совершили удивительную магию, чтобы заставить модную индексацию (которая включает в себя логическую индексацию) работать так же хорошо, как и она. Это волшебство довольно впечатляюще, но оно все еще не может справиться с необычной индексацией, за которой следует дополнительная индексация в левой части задания, например a[fancy][index2] = something. Вот простой пример:

>>> a = np.zeros(3)
>>> b = np.array([True, False, True])
>>> a[b][1:] = 2
array([ 0.,  0.,  0.])
>>> a[1:][b[1:]] = 2
array([ 0.,  0.,  2.])

Я думаю, что это ошибка, и мне интересно, можно ли ее перехватить и вызвать ошибку, вместо того чтобы позволить ей молча сбоить. Но, возвращаясь к вашему вопросу, кажется, самое простое решение - заменить:

a[a['ena']]['step_secs'][1:] = timestep

с:

tmp = a['ena'][1:]
a['step_secs'][1:][tmp] = timestep

или, может быть:

a['step_secs'][1:][a['ena'][1:]] = timestep
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...