2015-04-14 5 views
2

Почему форма неопределенного структурированного массива с одной строкой не определена ('()') и что является общим «обходным решением»?numpy структурированный массив без информации о форме?

import io 
fileWrapper = io.StringIO("-0.09469 0.032987 0.061009 0.0588") 

a =np.loadtxt(fileWrapper,dtype=np.dtype([('min', (float,2)), ('max',(float,2))]), delimiter= " ", comments="#"); 
print(np.shape(a), a) 

Выход:() ([-0,09469, 0,032987], [0,061009, 0,0588])

+0

Что результат 'печати Ā' после' = np.loadtxt' – Kasramvd

+0

добавил результат выше – Gabriel

+0

. Это то, как непоследовательное неправильное поведение делает синтаксис кода безумным, т. е. различает массивы одиночных строк или более крупные. – Gabriel

ответ

3

Короткий ответ: Добавьте аргумент ndmin=1 к loadtxt вызова.

Длинный ответ:

форма является () по той же причине, что чтение одного значения с плавающей точкой с loadtxt возвращает массив с формой ():

In [43]: a = np.loadtxt(['1.0']) 

In [44]: a.shape 
Out[44]:() 

In [45]: a 
Out[45]: array(1.0) 

По умолчанию loadtxt использует squeeze Функция для устранения тривиальных (т.е. длины 1) измерений в массиве, который он возвращает. В моем примере выше это означает, что результатом является «скалярный массив» - массив с формой ().

Когда вы даете loadtxt структурированный тип dtype, структура определяет поля одного элемента массива. Обычно эти поля называются «столбцами», но структурированные массивы будут иметь больше смысла, если вы будете последовательно думать о них как о том, каковы они: массивы структур с полями. Если в вашем файле данных были две строки, массив, возвращаемый loadtxt, будет массивом с формой (2,). То есть, это одномерный массив с длиной 2. Каждый элемент массива представляет собой структуру, поля которой определяются данным dtype. Когда входной файл имеет только одну строку, массив будет иметь форму (1,), но loadtxt сжимает это, чтобы быть скалярным массивом с формой ().

Чтобы заставить loadtxt всегда возвращать одномерный массив, даже если имеется одна строка данных, используйте аргумент ndmin=1.

Например, вот DTYPE для структурированного массива:

In [58]: dt = np.dtype([('x', np.float64), ('y', np.float64)]) 

Читать одну строку с помощью этого DTYPE. Результат имеет форму ():

In [59]: a = np.loadtxt(['1.0 2.0'], dtype=dt) 

In [60]: a.shape 
Out[60]:() 

Используйте ndmin=1, чтобы гарантировать, что даже вход с единичными результатами линии в одномерном массиве:

In [61]: a = np.loadtxt(['1.0 2.0'], dtype=dt, ndmin=1) 

In [62]: a.shape 
Out[62]: (1,) 

In [63]: a 
Out[63]: 
array([(1.0, 2.0)], 
     dtype=[('x', '<f8'), ('y', '<f8')]) 
+0

очень краткий ответ !! – Gabriel

Смежные вопросы