-
Notifications
You must be signed in to change notification settings - Fork 218
/
write.py
84 lines (66 loc) · 2.69 KB
/
write.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import sys
import segyio
import numpy as np
def main():
if len( sys.argv ) < 2:
sys.exit("Usage: write.py [file]")
filename = sys.argv[1]
# the mode parameter is passed directly to C's fopen
# opening the file for writing requires r+, not rw because rw would
# truncate (effectively destroy) the file, and r+ would preserve the size
with segyio.open( filename, "r+" ) as src:
# read trace 0, then double all values
trace = src.trace[0]
trace *= 2
# write trace 0 back to disk
src.trace[0] = trace
# read trace 1, but re-use the memory for speed
trace = src.trace[1]
# square all values. the trace is a plain numpy array
trace = np.square(trace, trace)
# write the trace back to disk, but at trace 2
src.trace[2] = trace
# read every other trace, from 10 through 20
# then write them to every third step from 40 through 52
# i.e. 40, 43, 46...
# slices yield a generator, so only one numpy array is created
for tr, i in zip(src.trace[10:20:2], range(2,13,3)):
src.trace[i] = tr
# iterate over all traces in a file. this is a generator with a shared
# buffer, so it's quite efficient
tracesum = 0
for tr in src.trace:
# accumulate the traces' 30th value
tracesum += tr[30]
print("Trace sum: {}".format(tracesum))
# write the iline at 2 to the iline at 3
sum3 = np.sum(src.iline[3])
src.iline[2] = src.iline[3]
# flush to make sure our changes to the file are visible
src.flush()
sum2 = np.sum(src.iline[2])
print("Accumulates of inlines 2 and 3: {} -- {}".format(sum2, sum3))
# ilines too are plain numpy ndarrays, with trace-major addressing
# i.e. iline[2,40] would be yield trace#2's 40th value
iline = src.iline[2]
# since ilines are numpy arrays they also support numpy operations
iline = np.add(iline, src.iline[4])
# lines too have generator support, so we accumulate the 2nd trace's
# 22nd value.
linesum = 0
for line in src.iline:
linesum += line[2,22]
print("Inline sum: {}".format(linesum))
# xline access is identical to iline access
linesum = 0
for line in src.xline:
linesum += line[2,22]
print("Crossline sum: {}".format(linesum))
# accessing a non-existing inline will raise a KeyError
try:
_ = src.iline[5000]
sys.exit("Was able to access non-existing inline")
except KeyError as e:
print(str(e))
if __name__ == '__main__':
main()