Короткий ответ: Добавьте аргумент 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')])
Что результат 'печати Ā' после' = np.loadtxt' – Kasramvd
добавил результат выше – Gabriel
. Это то, как непоследовательное неправильное поведение делает синтаксис кода безумным, т. е. различает массивы одиночных строк или более крупные. – Gabriel