2016-11-10 7 views
3

У меня есть .npy-файлы формы [512, 512, x] с x, достигающими максимально 400. В этих массивах (это правильный термин? Я не уверен в правильной терминологии), есть плавающая точка числа от нуля до единицы. Они представляют собой серый уровень шумового изображения. Изображение размером 512x512 пикселей, а для файла npy у меня есть другое количество изображений, которые я сохранил.Как открыть 3D-файл .npy в R или MATLAB?

теперь я хотел бы сделать некоторые расчеты с изображениями шума, но не смогли импортировать массивы в R или MATLAB:

В РИ попробовали RcppCNPy - пакет и получил ошибку «неподдерживаемый размер в npyLoad» ,

В MATLAB я попробовал функцию readNPY и получил ошибку «Этот файл не является форматом NUMPY на основе заголовка». Но у моего файла нет заголовка. Может быть, функция работает только для 2D-массивов?

Как я могу получить доступ к трехмерному массиву, который я сохранил раньше?

Любая помощь в MATLAB или R будет очень признательна!

+0

В R или в MATLAB? Они очень разные –

+3

Свяжитесь с разработчиками 'readNpy' напрямую. Пакет слишком новый. – hpaulj

+0

Либо R, либо MATLAB, хотя я думаю, что предпочел бы решение MATLAB ... – lilla

ответ

2

npy - это уникальный формат файла numpy. И да, у него есть блок заголовка, который содержит информацию, такую ​​как версия, размеры, шаги и тип dtype.

Быстрый взгляд на readNpy показывает, что он относительно новый и экспериментальный. Проконсультируйтесь с ними о возможностях.

np.savetxt пишет текст CSV. Это широко используется (посмотрите на количество вопросов SO о np.genfromtxt и np.loadtxt), но по самой природе «бумаги» есть 2d - строки столбцов. Я не знаю ни одного стандарта для написания массивов больших размеров - перестройка на 2d и обратно, вероятно, самая простая.

scipy.io.savemat может писать MATLAB-совместимые файлы .mat. Это (и loadmat) способно считывать/записывать более высокие D-массивы и структуры и ячейки MATLAB. Это лучший проверенный обмен файлами между numpy и MATLAB.

Новый формат сохранения MATLAB использует файлы HDF5. Пакет Python h5py может читать и записывать их. Произошло рассеяние SO-вопросов о чтении этого типа файла, созданного MATLAB. Python-created HDF5 dataset transposed in Matlab

Имейте в виду, что порядок размеров MATLAB эквивалентен порядку numpy 'F'.

Сравнить:

xf=np.arange(12).reshape(3,4,order='F') # saved with savemat 

>> xf(:).'  # in octave 
ans = 
    0 1 2 3 4 5 6 7 8 9 10 11 

без заказа = F, октава дает

0 4 8 1 5 9 2 6 10 3 7 11 

и

>> xf 
xf = 
    0 3 6 9 
    1 4 7 10 
    2 5 8 11 

>> x 
x = 
    0 1 2 3 
    4 5 6 7 
    8 9 10 11 

np.asfortranarray(x) не кажется, чтобы сделать разницу.

+0

спасибо, что работает для меня и прост в использовании – lilla

+0

Спасибо за примечание! Если я правильно понял, чтобы получить тот же массив значений в MATLAB, который был создан в NumPy, я должен использовать numpy.asfortranarray при создании массива, правильно? – lilla

+0

Попробуйте. 'savemat' может сделать это в любом случае. Посмотрите на порядок значений в раскованных версиях до и после. 'loadmat' дает вам файлы' order F'. – hpaulj

0

Если у вас есть доступ к python и numpy, обходным путем является загрузка файлов .npy с помощью np.load(), а затем сохраните их в формате txt с помощью np.savetxt().

EDIT: Кажется, что savetxt() не работает с 3D-массивами, поэтому в python2 вы можете использовать файл() для последовательной записи 2D записи вашего массива:

import numpy as np 
a = np.arange(60).reshape(3, 4, 5) 
with file("test.txt", 'w') as f: 
    for slice in a: 
     np.savetxt(f, a) 

Вы также можете изменить форму, чтобы 2D-массив, используйте savetxt, затем загрузите его в csv/Matlab и измените его.

+0

Спасибо за вашу идею. Я просто попробовал, и, к сожалению, он не работает: до тех пор, пока массив является 2D, все в порядке, но как только третье измерение больше 1, оно выходит из строя с ошибкой: «Несоответствие между массивом dtype ('float64 ') и спецификатор формата ". Мой спецификатор - «% f», и поскольку он отлично работает для первого изображения шума и только падает после создания второго, я думаю, что ошибка действительно связана с размерами массива ... – lilla

+0

Если вы используете python2, вы можете использовать встроенную функцию file(), чтобы сохранить 2D-фрагменты массива (см. мое редактирование). –

+0

мог бы я получить новый файл для каждого фрагмента? Поскольку срезы соответствуют пробным номерам одного человека, я предпочитаю держать их вместе ... – lilla

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