...
Saving (and loading) a numpy array (e.g. image) to (from) a file
If you want to save one array (max 2 dimensions), you can use binary numpy file or ascii file:
Code Block |
---|
import numpy as np
# binary file .npy format
np.save("filename.npy", array)
array = np.load("filename.npy")
# txt file
np.savetxt("filename.dat", array)
array = loadtxt("filename.dat" array)
array = np.load("filename.npy")
# txt file
np.savetxt("filename.dat", array)
array = loadtxt("filename.dat")
|
If you need to save multiple events/shots in the same file you will need to do some tricks (e.g. flatten the array and stack 1d arrays into 2d arrays where axis2 represent event number). Or you could save as an HDF5 file.
You can save an array or several into an HDF5 file (example from pyana):
Code Block |
---|
import h5py
# in beginjob()
ofile = h5py.File(self.output_file, 'w') # open for writing (overwrites existing file)
self.shot_counter = 0
# in event()
# option1: store several arrays from one shot in a group labeled with shot (event) number
shot_counter += 1
group = ofile.create_group("Shot%d" % shot_counter)
image1_source = "CxiSc1-0|TM6740-1"
image2_source = "CxiSc1-0|TM6740-2"
frame = evt.getFrameValue(image1_source)
image1 = frame.data()
frame = evt.getFrameValue(image2_source)
image2 = frame.data()
dataset1 = group.create_dataset("%s"%image1_source,data=image1)
dataset2 = group.create_dataset("%s"%image2_source,data=image2)
# in endjob()
ofile.close()
|
A comparison with MatLab.
MatLab | MatPlotLib | Comments |
---|
Loglog plot of one array vs. another Code Block |
---|
%
%
%
a1 = subplot(121);
loglog(channels(:,1),channels(:,2),'o')
xlabel('CH0')
ylabel('CH1')
a2 = subplot(122);
loglog(channels(:,3),channels(:,4),'o')
xlabel('CH2')
ylabel('CH3')
|
| Loglog plot of one array vs. another Code Block |
---|
import matplotlib.pyplot as plt
import numpy as np
a1 = plt.subplot(221)
plt.loglog(channels[:,0],channels[:,1], 'o' )
plt.xlabel('CH0')
plt.ylabel('CH1')
a2 = plt.subplot(222)
plt.loglog(channels[:,2],channels[:,3], 'o' )
plt.xlabel('CH2')
plt.ylabel('CH3')
|
| channels is a 4xN array of floats, where N is the number of events. Each column corresponds to one out of four Ipimb channels.
Note that the arrays are indexed with 1,2,3,4 in MatLab and 0,1,2,3 in MatPlotLib/NumPy/Python.
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="34f56ae1dd46a437-521509b9-40b54c77-b601b902-45733dbeebe400f801db667f"><ac:plain-text-body><![CDATA[Note also the use of paranthesis, array() in MatLab, array[] in MatPlotLib. | ]]></ac:plain-text-body></ac:structured-macro> |
test | test | Test |
array of limits from graphical input | array of limits from graphical input | |
Code Block |
---|
axes(a1)
hold on
lims(1:2,:) = ginput(2);
axes(a2)
hold on
lims(3:4,:) = ginput(2);
|
| Code Block |
---|
plt.axes(a1)
plt.hold(True)
limslista = plt.ginput(2)
plt.axes(a2)
plt.hold(True)
limslistb = plt.ginput(2)
limsa = np.array(limslista)
limsb = np.array(limslistb)
lims = np.hstack( [limsa, limsb] )
|
| In MatLab, lims is an expandable array that holds limits as set by input from mouse click on the plot (ginput). NumPy arrays cannot be expanded, so I've chosen to append to a python list first, then fill a NumPy array for the usage to look the same.
The exact usage of the lims array depends on where you place each limit. I think perhaps I've done it differently from the MatLab version. |
| | |
filter | filter | |
Code Block |
---|
fbool1 = (channels(:,1)>min(lims(1:2,1)))&(channels(:,1)<max(lims(1:2,1)))
fbool2 = (channels(:,2)>min(lims(1:2,2)))&(channels(:,2)<max(lims(1:2,2)));
fbool = fbool1&fbool2
loglog(channels(fbool,1),channels(fbool,2),'or')
fbool3 = (channels(:,3)>min(lims(3:4,3)))&(channels(:,3)<max(lims(3:4,3)))
fbool4 = (channels(:,4)>min(lims(3:4,4)))&(channels(:,4)<max(lims(3:4,4)));
fbool = fbool3&fbool4
loglog(channels(fbool,3),channels(fbool,4),'or') |
| Code Block |
---|
fbools0 = (channels[:,0]>lims[:,0].min())&(channels[:,0]<lims[:,0].max())
fbools1 = (channels[:,1]>lims[:,1].min())&(channels[:,1]<lims[:,1].max())
fbools = fbools0 & fbools1
fbools2 = (channels[:,2]>lims[:,2].min())&(channels[:,2]<lims[:,2].max())
fbools3 = (channels[:,3]>lims[:,3].min())&(channels[:,3]<lims[:,3].max())
fbools = fbools2&fbools3
|
| Comment |
| | |