Skip to content

Commit 39b22f8

Browse files
committed
send data pointer and use excedence mask
1 parent 0e9f3c3 commit 39b22f8

File tree

2 files changed

+9
-16
lines changed

2 files changed

+9
-16
lines changed

src/hecdss/gridded_data.py

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -102,24 +102,17 @@ def range_limit_table(self, minval, maxval, range_, bins, datasize, data):
102102
if bins > max_bins:
103103
bins = max_bins
104104

105-
self.rangeLimitTable = [0] * bins
106-
self.numberEqualOrExceedingRangeLimit = [0] * bins
107-
105+
self.rangeLimitTable = np.empty(bins, dtype=float)
108106
self.rangeLimitTable[0] = NULL_INT
109107
self.rangeLimitTable[1] = minval
110108

111109
step = range_ / bins
112-
113-
for i in range(2, bins):
114-
self.rangeLimitTable[i] = minval + step * i
110+
self.rangeLimitTable[2:] = minval + step * np.arange(2, bins)
115111

116112
self.rangeLimitTable[bins - 1] = maxval
117113
# Exceedance
118-
sorted_data = np.sort(data)
119-
n = len(sorted_data)
120-
for jdx in range(bins):
121-
idx = np.searchsorted(sorted_data, self.rangeLimitTable[jdx], side="left")
122-
self.numberEqualOrExceedingRangeLimit[jdx] = n - idx
114+
mask = data[None, :] >= self.rangeLimitTable[:, None]
115+
self.numberEqualOrExceedingRangeLimit = mask.sum(axis=1)
123116

124117
def update_grid_info(self):
125118
"""
@@ -134,8 +127,8 @@ def update_grid_info(self):
134127
self.meanDataValue = np.nanmean(self.data)
135128

136129
self.data = np.nan_to_num(self.data, nan=NULL_INT)
137-
self.numberOfRanges = math.floor(1 + 3.322 * math.log10(n) + 1)
138-
flat_data = self.data.ravel()
130+
self.numberOfRanges = math.floor(2 + 3.322 * math.log10(n))
131+
flat_data = self.data.flatten()
139132
self.range_limit_table(self.minDataValue, self.maxDataValue, bin_range, self.numberOfRanges, n, flat_data)
140133

141134
@staticmethod

src/hecdss/native.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,6 @@ def hec_dss_gridStore(
331331
self,
332332
gd,
333333
):
334-
335334
self.dll.hec_dss_pdStore.restype = c_int
336335
self.dll.hec_dss_pdStore.argtypes = [
337336
ctypes.POINTER(ctypes.c_void_p), # dss (dss file pointer)
@@ -395,8 +394,9 @@ def hec_dss_gridStore(
395394
c_rangeLimitTable = (c_float * len(gd.rangeLimitTable))(*gd.rangeLimitTable)
396395
c_numberEqualOrExceedingRangeLimit = (c_int * len(gd.numberEqualOrExceedingRangeLimit))(
397396
*gd.numberEqualOrExceedingRangeLimit)
398-
flat_list = gd.data.flatten()
399-
c_data = (c_float * len(flat_list))(*flat_list)
397+
398+
arr = gd.data.astype('float32', copy=False)
399+
c_data = arr.ctypes.data_as(ctypes.POINTER(ctypes.c_float))
400400

401401
return self.dll.hec_dss_gridStore(self.handle, c_pathname, c_gridType, c_dataType,
402402
c_lowerLeftCellX, c_lowerLeftCellY,

0 commit comments

Comments
 (0)