[PYTHON] 파이썬에서 Matlab의 'fread'에 해당하는 것은 무엇입니까?
PYTHON파이썬에서 Matlab의 'fread'에 해당하는 것은 무엇입니까?
Matlab에 대한 지식이 거의 없으므로 일부 파싱 루틴을 Python으로 변환해야합니다. 그것들은 대용량 파일을위한 것이며, 그 자체가 '블록'으로 나뉘어져 있으며, 파일의 맨 위에있는 체크섬을 사용하는 순간부터 어려움을 겪고 있습니다.
Matlab에서 정확히 무슨 일이 벌어지고 있습니까?
status = fseek(fid, 0, 'cof');
fposition = ftell(fid);
disp(' ');
disp(['** Block ',num2str(iBlock),' File Position = ',int2str(fposition)]);
% ----------------- Block Start ------------------ %
[A, count] = fread(fid, 3, 'uint32');
if(count == 3)
magic_l = A(1);
magic_h = A(2);
block_length = A(3);
else
if(fposition == file_length)
disp(['** End of file OK']);
else
disp(['** Cannot read block start magic ! Note File Length = ',num2str(file_length)]);
end
ok = 0;
break;
end
fid는 현재보고있는 파일입니다. iBlock은 파일 내에서 '차단'하는 카운터입니다.
magic_l과 magic_h는 나중에 체크섬과 관련이 있습니다. 여기에 대한 코드는 다음과 같습니다 (위의 코드에서 바로 알 수 있습니다).
disp(sprintf(' Magic_L = %08X, Magic_H = %08X, Length = %i', magic_l, magic_h, block_length));
correct_magic_l = hex2dec('4D445254');
correct_magic_h = hex2dec('43494741');
if(magic_l ~= correct_magic_l | magic_h ~= correct_magic_h)
disp(['** Bad block start magic !']);
ok = 0;
return;
end
remaining_length = block_length - 3*4 - 3*4; % We read Block Header, and we expect a footer
disp(sprintf(' Remaining Block bytes = %i', remaining_length));
정말로, 나는 복제하는 법을 알고 싶다. [A, count] = fread (fid, 3, 'uint32'); 파이썬에서는 io.readline ()이 파일의 처음 3 문자를 가져 오는 중이다. 내가 여기서 어딘가에 요점을 놓치면 사과드립니다. 파일에서 io.readline (3)을 사용하면 안되는 것을 반환하는 것으로 보이고, 잠재적으로 매우 길어질 수있는 block_length가 어떻게 단일 바이트에 들어갈 수 있는지 이해하지 못합니다.
이 산책을 읽어 주셔서 감사합니다. 내가 알고 싶은 것을 이해할 수 있기를 바랍니다. (모든 통찰력은 인정됩니다.)
해결법
-
==============================
1.fread의 문서에서 이진 데이터를 읽는 함수입니다. 두 번째 인수는 출력 벡터의 크기를 지정하고 세 번째 인수는 읽은 항목의 크기 / 유형을 지정합니다.
fread의 문서에서 이진 데이터를 읽는 함수입니다. 두 번째 인수는 출력 벡터의 크기를 지정하고 세 번째 인수는 읽은 항목의 크기 / 유형을 지정합니다.
이것을 파이썬에서 다시 만들려면 배열 모듈을 사용할 수 있습니다 :
f = open(...) import array a = array.array("L") # L is the typecode for uint32 a.fromfile(f, 3)
그러면 f 파일에서 3 개의 uint32 값을 읽습니다.이 값은 나중에 사용할 수 있습니다. fromfile의 문서에서 :
배열은 시퀀스 프로토콜을 구현하므로 목록과 동일한 작업을 지원하지만 .tolist () 메서드를 사용하여 배열에서 일반 목록을 만들 수도 있습니다.
-
==============================
2.Matlab을 Python으로 대체 할 때, 바이너리 데이터를 numpy.array로 읽으려고 했으므로 numpy.fromfile을 사용하여 데이터를 1 차원 배열로 읽습니다.
Matlab을 Python으로 대체 할 때, 바이너리 데이터를 numpy.array로 읽으려고 했으므로 numpy.fromfile을 사용하여 데이터를 1 차원 배열로 읽습니다.
import numpy as np with open(inputfilename, 'rb') as fid: data_array = np.fromfile(fid, np.int16)
numpy.fromfile과 다른 Python 솔루션을 비교하면 다음과 같은 이점이 있습니다.
Matlab fread는 열 벡터로 읽는 대신 데이터를 [m, n] 형식의 행렬로 읽는 기능이 있습니다. 예를 들어, 2 행의 행렬로 데이터를 읽으려면 다음을 사용하십시오.
fid = fopen(inputfilename, 'r'); data_array = fread(fid, [2, inf], 'int16'); fclose(fid);
Numpy의 모양과 조 변경을 사용하여 Python에서이 시나리오를 처리 할 수 있습니다.
import numpy as np with open(inputfilename, 'rb') as fid: data_array = np.fromfile(fid, np.int16).reshape((-1, 2)).T
-
==============================
3.Matlab에서 fread ()의 시그니처 중 하나는 fread (fileID, sizeA, precision)입니다. 이것은 파일의 첫 번째 sizeA 요소 (바이트가 아님)를 읽습니다. 각 요소는 정밀도에 충분한 크기입니다. 이 경우 uint32를 읽으므로 각 요소의 크기는 32 비트 또는 4 바이트입니다.
Matlab에서 fread ()의 시그니처 중 하나는 fread (fileID, sizeA, precision)입니다. 이것은 파일의 첫 번째 sizeA 요소 (바이트가 아님)를 읽습니다. 각 요소는 정밀도에 충분한 크기입니다. 이 경우 uint32를 읽으므로 각 요소의 크기는 32 비트 또는 4 바이트입니다.
대신에 io.readline (12)을 사용하여 파일에서 처음 3 개의 4 바이트 요소를 가져 오십시오.
-
==============================
4.첫 번째 부분은 Torsten의 대답으로 덮여 있습니다. 어쨌든 배열이나 numarray를 사용하여이 데이터를 처리해야합니다.
첫 번째 부분은 Torsten의 대답으로 덮여 있습니다. 어쨌든 배열이나 numarray를 사용하여이 데이터를 처리해야합니다.
% 08X와 hex2dec의 경우, % 08X는 unit32 숫자 (8 자리 16 진수, 정확히 파이썬과 동일)의 인쇄 형식이며 0x4D445254의 경우 hex2dec ( '4D445254')는 matlab입니다.
마지막으로, ~ = matlab에 비트 비교입니다; 파이썬에서는 ==를 사용합니다.
from https://stackoverflow.com/questions/2146031/what-is-the-equivalent-of-fread-from-matlab-in-python by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 목록에서 고유 한 값을 계산하려면 어떻게합니까? (0) | 2018.11.25 |
---|---|
[PYTHON] 비 블로킹 HTTP POST 요청 보내기 (0) | 2018.11.25 |
[PYTHON] 파이썬에서 소수 자릿수 지정하기 (0) | 2018.11.25 |
[PYTHON] 팬더 : 두 개의 데이터 프레임을 요소로 나누는 것 (0) | 2018.11.25 |
[PYTHON] 파이썬을 사용하여 2 차원 어레이 (이미지)의 픽셀 이웃 (0) | 2018.11.25 |