-
Notifications
You must be signed in to change notification settings - Fork 234
clib.Session.virtualfile_from_vectors: Now takes a sequence of vectors as its single argument (Passing multiple arguments will be unsupported in v0.16.0) #3522
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 2 commits
29bd3f8
f5b0e8e
361d837
f786b8e
3893211
b7b87c6
6481df2
089ef3f
1a43e38
697d66b
7ef4e01
b2032c8
c41806e
61f323c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -1330,7 +1330,7 @@ def open_virtual_file(self, family, geometry, direction, data): | |
| return self.open_virtualfile(family, geometry, direction, data) | ||
|
|
||
| @contextlib.contextmanager | ||
| def virtualfile_from_vectors(self, *vectors): | ||
| def virtualfile_from_vectors(self, vectors, *args): | ||
| """ | ||
| Store 1-D arrays as columns of a table inside a virtual file. | ||
|
|
||
|
|
@@ -1372,13 +1372,24 @@ def virtualfile_from_vectors(self, *vectors): | |
| >>> y = np.array([4, 5, 6]) | ||
| >>> z = pd.Series([7, 8, 9]) | ||
| >>> with Session() as ses: | ||
| ... with ses.virtualfile_from_vectors(x, y, z) as fin: | ||
| ... with ses.virtualfile_from_vectors((x, y, z)) as fin: | ||
| ... # Send the output to a file so that we can read it | ||
| ... with GMTTempFile() as fout: | ||
| ... ses.call_module("info", [fin, f"->{fout.name}"]) | ||
| ... print(fout.read().strip()) | ||
| <vector memory>: N = 3 <1/3> <4/6> <7/9> | ||
| """ | ||
| if len(args) > 0: | ||
| warnings.warn( | ||
| "Passing multiple arguments to Session.virtualfile_fro_vectors is " | ||
seisman marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| "deprecated since v0.14.0 and will be unsupported in v0.16.0. " | ||
| "Pass all vectors as a single tuple instead, e.g., " | ||
| "Use `with lib.virtualfile_from_vectors((x, y, z)) as vfile` " | ||
| "instead of `with lib.virtualfile_from_vectors(x, y, z) as vfile`.", | ||
| category=FutureWarning, | ||
| stacklevel=3, | ||
| ) | ||
| vectors = (vectors, *args) | ||
| # Conversion to a C-contiguous array needs to be done here and not in | ||
| # put_vector or put_strings because we need to maintain a reference to | ||
| # the copy while it is being used by the C API. Otherwise, the array | ||
|
|
@@ -1791,19 +1802,19 @@ def virtualfile_in( # noqa: PLR0912 | |
| "vectors": self.virtualfile_from_vectors, | ||
| }[kind] | ||
|
|
||
| # Ensure the data is an iterable (Python list or tuple). | ||
| # "_data" is the data that will be passed to the _virtualfile_from function. | ||
| # "_data" defaults to "data" but should be adjusted for some cases. | ||
| _data = data | ||
| match kind: | ||
| case "arg" | "file" | "geojson" | "grid" | "image" | "stringio": | ||
|
Comment on lines
+1798
to
-1786
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Maybe just put So that if there's a new
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
We can't do it like this, because we're currently writing case statements like We can refactor the codes to: or I still prefer the current codes, which set
If there is a new
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ah ok, that makes sense, let's keep |
||
| _data = (data,) | ||
| if kind == "image" and data.dtype != "uint8": | ||
| msg = ( | ||
| f"Input image has dtype: {data.dtype} which is unsupported, " | ||
| "and may result in an incorrect output. Please recast image " | ||
| "to a uint8 dtype and/or scale to 0-255 range, e.g. " | ||
| "using a histogram equalization function like " | ||
| "skimage.exposure.equalize_hist." | ||
| ) | ||
| warnings.warn(message=msg, category=RuntimeWarning, stacklevel=2) | ||
| case "image" if data.dtype != "uint8": | ||
| msg = ( | ||
| f"Input image has dtype: {data.dtype} which is unsupported, " | ||
| "and may result in an incorrect output. Please recast image " | ||
| "to a uint8 dtype and/or scale to 0-255 range, e.g. " | ||
| "using a histogram equalization function like " | ||
| "skimage.exposure.equalize_hist." | ||
| ) | ||
| warnings.warn(message=msg, category=RuntimeWarning, stacklevel=2) | ||
| case "empty": # data is None, so data must be given via x/y/z. | ||
| _data = [x, y] | ||
| if z is not None: | ||
|
|
@@ -1818,19 +1829,19 @@ def virtualfile_in( # noqa: PLR0912 | |
| else: | ||
| # Python list, tuple, numpy.ndarray, and pandas.Series types | ||
| _data = np.atleast_2d(np.asanyarray(data).T) | ||
| case "matrix": | ||
| case "matrix" if data.dtype.kind not in "iuf": | ||
| # GMT can only accept a 2-D matrix which are signed integer (i), | ||
| # unsigned integer (u) or floating point (f) types. For other data | ||
| # types, we need to use virtualfile_from_vectors instead, which turns | ||
| # the matrix into a list of vectors and allows for better handling of | ||
| # non-integer/float type inputs (e.g. for string or datetime data types) | ||
| _data = (data,) | ||
| if data.dtype.kind not in "iuf": | ||
| _virtualfile_from = self.virtualfile_from_vectors | ||
| _data = data.T | ||
| _virtualfile_from = self.virtualfile_from_vectors | ||
| _data = data.T | ||
| case _: | ||
| pass | ||
|
|
||
| # Finally create the virtualfile from the data, to be passed into GMT | ||
| file_context = _virtualfile_from(*_data) | ||
| file_context = _virtualfile_from(_data) | ||
| return file_context | ||
|
|
||
| def virtualfile_from_data( | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.