2016-04-08 3 views
1

Я пытаюсь предварительно выделить пустой массив и в то же время, определяющего тип данных с размером 19x5, используя следующий код:Форма структурированного массива в NumPy

import numpy as np 
arr=np.empty((19,5),dtype=[('a','|S1'),('b', 'f4'),('c', 'i'),('d', 'f4'),('e', 'f4')]) 

Результат несколько неожиданный, давая массив 19 * 5 * 5. Однако, попытка:

arr=np.empty((19,1),dtype=[('a','|S1'),('b', 'f4'),('c', 'i'),('d', 'f4'),('e', 'f4')]) 

дает правильную длину каждой строки (5 полей), которые, по-видимому выглядит как массив 1D.

Когда я пытаюсь написать это, только это форматирование допускается:

np.savetxt(file, arr, delimiter=',', fmt='%s') 

Это говорит мне, что я имею дело с одной строкой. Невозможно получить структурированный массив размером 19x5, который не сплющивается?

Основная проблема возникает при написании этого с помощью savetxt. Я хочу иметь файл csv, который имеет все 5 значений столбца. Поскольку это обрабатывается как строка, это дает неправильный вывод.

+0

Вы можете использовать pandas DataFrame, который обычно лучше структурированного массива numpy. Если вы хотите изучить этот вариант, скажите так. Я приведу пример, основанный на вышеуказанном вопросе. – Hun

+0

Спасибо @ Хун. Я изучал это раньше.К счастью, мне удалось заполнить код, используя структурированные массивы numpy. Я дам вам знать, нужна ли помощь для панд. – Fourier

ответ

2

Обычно поля структурированного массива заменяют столбцы массива 2d. Часто люди загружают csv с genfromtxt и удивляются, почему результат 1d. Как вы нашли, вы можете сделать 2d-массив с соединением dtype, но каждый элемент будет иметь несколько значений - как указано dtype.

Обычно вы должны инициализировать этот массив с помощью 1d-формы, например. (19,).

Обратите внимание, что вы должны заполнить значения по полю или списку кортежей.

У меня нет опыта использования savetxt со структурированным массивом и невозможно выполнить тесты на этом планшете. Но, возможно, есть вопросы, которые помогают.

savetxt выполняет итерацию по массиву и пишет fmt%tuple(row), где fmt построен с вашего ввода.

Я предлагаю попробовать fmt='%s %s. %s. %s %s' - a % формат для каждого поля в dtype. См. Его документы. Также я не знаю, будет ли массив (19,) вести себя лучше, чем (19,1).

Эксперимент с элементами форматирования вашего массива. Они должны выглядеть как кортежи для форматирования. Если не попробовать tolist() или tuple(A[0]).

Вот ответ, который почти достаточно хорошо, чтобы быть дубликатом

https://stackoverflow.com/a/35209070/901925

ab = np.zeros(names.size, dtype=[('var1', 'S6'), ('var2', float)]) 
np.savetxt('test.txt', ab, fmt="%10s %10.3f") 

===================

savetxt может обрабатывать только 1d структурированный массив из-за форматирования кортежа.

+0

Очень проницательный ответ. Большое спасибо. – Fourier

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