2014-12-31 2 views
1

Если я хочу создать массив numpy с dtype = [('index','<u4'),('valid','b1')], и у меня есть отдельные массивы numpy для 32-разрядных значений index и boolean valid, как я могу это сделать?Создание многоуровневых структурированных массивов из столбцов

Я не вижу пути в конструкторе numpy.ndarray; Я знаю, что могу это сделать:

arr = np.zeros(n, dtype = [('index','<u4'),('valid','b1')]) 
arr['index'] = indices 
arr['valid'] = validity 

, но почему-то называя np.zeros() первый кажется неправильным.

Любые предложения?

+0

Нет ничего плохого в заполнении «столбцов», подобных этому. Единственная альтернатива - дать ему список кортежей: '[(i [0], v [0), (i [1], v [1]) ...]'. – hpaulj

ответ

2

Альтернатива

arr = np.fromiter(zip(indices, validity), dtype=[('index','<u4'),('valid','b1')]) 

, но я подозреваю, что ваша первоначальная идея является более эффективной. (В своем подходе, вы могли бы использовать np.empty() вместо np.zeros() на пользу миниатюрного исполнения.)

1

Просто используйте empty вместо zeros, и он должен чувствовать себя менее «неправильно», так как вы просто выделить данные без ненужного обнуления его ,

Или используйте fromiter, а также передайте необязательный аргумент count, если вы заинтересованы в производительности.

Это в любом случае вопрос вкуса в более чем 99% случаев использования и не приведет к заметным улучшениям производительности ИМХО.