Read/Write binary file - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: Python Coding (https://python-forum.io/forum-7.html) +--- Forum: General Coding Help (https://python-forum.io/forum-8.html) +--- Thread: Read/Write binary file (/thread-32272.html) |
Read/Write binary file - deanhystad - Jan-31-2021 I have a binary file that contains 32 bit floats. I would like to read the file into a matrix, rotate the matrix, and then write the matrix to a file. In the original file the values would be arranged like this: a0, b0, a1, b1, a2, b2, a3, b3...aN, bN where a,b can be thought of as rows and 1, 2, 3 as columns. In the resulting file the values would be arranged like this: a0, a1, a2, a3...aN, b0, b1, b2, b3...bN I'm beginning to think I might need to use the array library to read and write the files, and write some C code to do the rotation. Does anyone know of other ways? RE: Read/Write binary file - Larz60+ - Feb-01-2021 I don't think it's nearly as complicated as you think. Please supply a sample file. RE: Read/Write binary file - deanhystad - Feb-01-2021 I don't know how to provide a sample file, so here is some code to generate the sample file and demonstrate the kind of manipulation I need. import numpy as np from array import array a = array('f', [x for _ in range(10) for x in range(4)]) with open('sample_order.bin', 'wb') as file: a.tofile(file) a = array('f') with open('sample_order.bin', 'rb') as file: a.fromfile(file, 40) print('Sample order file', a, sep='\n') b = np.array(a) print('As numpy array', b, sep='\n') c = b.reshape((10, 4)) print('As a matrix', c, sep='\n') d = c.transpose() print('As matrix in channel order', d, sep='\n') e = array('f', d.flatten()) print('Channel order file', e, sep='\n') with open('channel_order.bin', 'wb') as file: e.tofile(file)I start with an array like this: 0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3 I want to convert this to: 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3 I am doing this by turning it into a matrix, transposing the matrix and then flattening the matrix, I know there has to be a better way. RE: Read/Write binary file - Larz60+ - Feb-01-2021 for 2d array, I'd use something like below But you have a single dimension array, so you're way ahead of me on this. import numpy as np from scipy.ndimage.interpolation import rotate import os # make sure file can be found in script directory os.chdir(os.path.abspath(os.path.dirname(__file__))) def rotate_and_save(infilename, outfilename, rotation_angle_degrees=90): orig_array = np.fromfile(infilename, dtype=np.int64) print(f"\noriginal array\n{orig_array}") new_array = rotate(orig_array, angle=rotation_angle_degrees) print(f"\nnew array\n{new_array}") np.tofile(outfilename, dtype=np.int64) def main(): # Use any desired angle rotate_and_save('channel_order.bin', 'rotated_channel_order.bin', rotation_angle_degrees=180) if __name__ == '__main__': main( |