The nodata value is being considered when computing the statistics, as you've found. So either replace it with np.nan and use stats functions that are NaN-aware:
array[array == ds.nodata] = np.nan
arr_min = np.nanmin(array)
Or mask off the nodata values and compute the stats off of that:
m = (array != ds.nodata)
arr_min = array[m].min()
I think the docs do a pretty good job of describing the scale parameter (https://developers.google.com/earth-engine/scale). For example, if you reduceRegion() with an ee.Reducer.count() at a scale of 1000, think of if as changing the resolution of your image so the width and height of each pixel is 1000 meters. These 1000 meter pixels are then counted. From ...