Numpy: как заполнить несколько полей в структурированном массиве одновременно

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

Вот что я пытаюсь:

strc = np.zeros(4, dtype=[('x', int), ('y', int), ('z', int)])
x = np.array([2, 3])
strc[['x', 'y']][0] = x

Это дает мне это будущее предупреждение:

main: 1: FutureWarning: Numpy обнаружил, что вы (возможно) выполняете запись в массив, возвращенный numpy.diagonal, или выбрав несколько полей в массиве записей. Этот код, скорее всего, сломается в будущем выпуске NumPy - подробности см. В справочных документах numpy.diagonal или arrays.indexing. Быстрое решение - сделать явную копию (например, сделать arr.diagonal(). Copy() или arr[['f0','f1']]. Copy()).

Но даже если это предупреждение, структурированный массив не заполняется. Пока что я перебираю оба массива, и это работает, но я думаю, что это крайне неэффективно. Есть ли способ лучше?

1 ответ

Решение

Если все поля имеют одинаковый dtype, вы можете создать представление:

import numpy as np
strc = np.zeros(4, dtype=[('x', int), ('y', int), ('z', int)])
strc_view = strc.view(int).reshape(len(strc), -1)
x = np.array([2, 3])
strc_view[0, [0, 1]] = x

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

import numpy as np
strc = np.zeros(3, dtype=[('x', int), ('y', float), ('z', int), ('t', "i8")])

def fields_view(arr, fields):
    dtype2 = np.dtype({name:arr.dtype.fields[name] for name in fields})
    return np.ndarray(arr.shape, dtype2, arr, 0, arr.strides)

v1 = fields_view(strc, ["x", "z"])
v1[0] = 10, 100

v2 = fields_view(strc, ["y", "z"])
v2[1:] = [(3.14, 7)]

v3 = fields_view(strc, ["x", "t"])

v3[1:] = [(1000, 2**16)]

print strc

вот вывод:

[(10, 0.0, 100, 0L) (1000, 3.14, 7, 65536L) (1000, 3.14, 7, 65536L)]
Другие вопросы по тегам