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)]