Сохранение отдельных столбцов структурированного массива с numpy .savetxt: ValueError: fmt имеет неверное количество форматов% - PullRequest
1 голос
/ 12 апреля 2020

Я немного озадачен, потому что это работало ранее, когда я запускаю код 1-2 года a go.

У меня большой структурированный массив numpy с различными типами данных и именами столбцов. Я могу сохранить его с помощью numpy .savetxt (), если я предоставлю строку формата (fmt), которая описывает типы данных каждого столбца. Однако, если я хочу сохранить выборку из нескольких столбцов в массиве [['col_name1', 'col_name2']] вместе со строкой fmt для двух столбцов, я получаю следующее сообщение об ошибке: ValueError: fmt имеет неправильный номер % форматов:% i% i

Вот пример.

Сохранение всего массива работает:

import numpy as np
arr = np.zeros(3, dtype=[('w', int), ('x', float), ('y', int), ('z', "i8")])
np.savetxt('works.txt', arr, fmt="%i %06f %i %i")

Сохранение двух столбцов этого не:

import numpy as np
arr = np.zeros(3, dtype=[('w', int), ('x', float), ('y', int), ('z', "i8")])
np.savetxt('ValueError.txt', arr[['w','y']], fmt="%i %i")

Это дает мне сообщение об ошибке:

ValueError: fmt имеет неверное количество форматов%:% i% i

У меня есть сценарии, которые сделать то же самое с большими структурированными массивами, и они работали, когда я использовал это 1-2 года a go.

Я понятия не имею, что происходит. После выбора столбца массив dtype объекта имеет дополнительные атрибуты смещения и размер элемента. Это вызывает ошибку?

In [131]: arr
Out[131]: 
array([(0, 0., 0, 0), (0, 0., 0, 0), (0, 0., 0, 0)],
     dtype=[('w', '<i8'), ('x', '<f8'), ('y', '<i8'), ('z', '<i8')])

In [132]: arr[['w','y']]
Out[132]: 
array([(0, 0), (0, 0), (0, 0)],
     dtype={'names':['w','y'], 'formats':['<i8','<i8'], 'offsets':[0,16], 'itemsize':32})

Как я могу это исправить? Спасибо!

1 Ответ

0 голосов
/ 12 апреля 2020
In [66]: arr = np.zeros(3, dtype=[('w', int), ('x', float), ('y', int), ('z', "i8")])                  
In [67]: arr                                                                                           
Out[67]: 
array([(0, 0., 0, 0), (0, 0., 0, 0), (0, 0., 0, 0)],
      dtype=[('w', '<i8'), ('x', '<f8'), ('y', '<i8'), ('z', '<i8')])

Это работает для меня:

In [71]: np.savetxt('ValueError.txt', arr[['w','y']], fmt="%i %i")                                     
In [72]: cat ValueError.txt                                                                            
0 0
0 0
0 0

Я подозревал savetxt's способ форматирования 'строки':

In [73]: tuple(arr[['w','y']][0])                                                                      
Out[73]: (0, 0)

Моя версия:

In [74]: np.__version__                                                                                
Out[74]: '1.18.2'

В любом случае можно очистить выбор поля:

In [76]: import numpy.lib.recfunctions as rf                                                           
In [77]: rf.repack_fields(arr[['w','y']])                                                              
Out[77]: array([(0, 0), (0, 0), (0, 0)], dtype=[('w', '<i8'), ('y', '<i8')])
In [78]: np.savetxt('ValueError.txt', _77, fmt="%i %i")  

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

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