Как * фактически * удалить столбец из numpy структурированного массива (чтобы он не отображался в двоичном файле) - PullRequest
1 голос
/ 23 января 2020

У меня есть структурированный массив, который загружается из двоичного файла.

In [85]: dx = np.dtype([('op', '<u8'), ('me', '<u8'), ('gw', '<u8'), ('md', '<u8'), ('tt', '<u8'), ('bb', '<u8'), ('en', '<u8'), ('ab', '<u8'), ('st', 'u1')])

In [86]: s = np.fromfile("somefile.bin", dtype=dx)

In [87]: s
Out[87]:
array([(1574647200000000000, 1574647200000000000, 1574647200000000000, 1574647200000000000, 1574647200000000000, 1574647200000000000, 19374, 9223372036854775808, 0)],
      dtype=[('op', '<u8'), ('me', '<u8'), ('gw', '<u8'), ('md', '<u8'), ('tt', '<u8'), ('bb', '<u8'), ('en', '<u8'), ('ab', '<u8'), ('st', 'u1')])

Теперь мне нужно удалить некоторые из этих столбцов и сохранить данные в двоичном формате, который можно загрузить из C .

В numpy v1.13.3 работает следующий код:

In [88]: x = s[['op', 'st']]

In [89]: x
Out[89]:
array([(1574647200000000000, 0)],
      dtype={'names':['op','st'], 'formats':['<u8','u1'], 'offsets':[0,64], 'itemsize':65})

In [90]: x.tofile("updated.bin")

Значение, если я сейчас открою updated.bin в шестнадцатеричном редакторе или код C, он имеет только 8-байтовые и 1-байтовые значения uint.

Теперь переключитесь на numpy v1.17.1 или 1.18.x, этот код не работает, и двоичный файл содержит все данные из первого файл! похоже, что когда я сделал x = s[...] x, он все еще был представлением, и когда записывал x в файл, он записал все данные.

Я пробовал np.delete() и np.copy() и ndarray.copy() без удачи.

Кто-нибудь может мне помочь?

1 Ответ

1 голос
/ 25 января 2020

Используйте repack_fields для создания копии только с необходимыми полями: https://docs.scipy.org/doc/numpy/user/basics.rec.html?highlight=s#numpy .lib.recfunctions.repack_fields .

Начиная с 1.16, многополевая индексация создает представление который сохраняет исходный макет. Изменения были в работе, вкл и выкл, в течение нескольких выпусков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...