Skip to content

Commit 83673cf

Browse files
committed
Add tests for vectors_to_arrays
1 parent 20b9215 commit 83673cf

File tree

2 files changed

+109
-36
lines changed

2 files changed

+109
-36
lines changed

pygmt/clib/conversion.py

Lines changed: 1 addition & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,6 @@ def vectors_to_arrays(vectors: Sequence[Any]) -> list[np.ndarray]:
157157
158158
>>> import numpy as np
159159
>>> import pandas as pd
160-
>>> data = np.array([[1, 2], [3, 4], [5, 6]])
161160
>>> vectors = [data[:, 0], data[:, 1], pd.Series(data=[-1, -2, -3])]
162161
>>> all(i.flags.c_contiguous for i in vectors)
163162
False
@@ -168,41 +167,7 @@ def vectors_to_arrays(vectors: Sequence[Any]) -> list[np.ndarray]:
168167
True
169168
>>> all(isinstance(i, np.ndarray) for i in arrays)
170169
True
171-
172-
>>> data = [[1, 2], (3, 4), range(5, 7)]
173-
>>> all(isinstance(i, np.ndarray) for i in vectors_to_arrays(data))
174-
True
175-
176-
>>> # Sequence of scalars are converted to 1-D arrays
177-
>>> data = vectors_to_arrays([1, 2, 3.0])
178-
>>> data
179-
[array([1]), array([2]), array([3.])]
180-
>>> [i.ndim for i in data] # Check that they are 1-D arrays
181-
[1, 1, 1]
182-
183-
>>> series = pd.Series(data=[0, 4, pd.NA, 8, 6], dtype=pd.Int32Dtype())
184-
>>> vectors_to_arrays([series])
185-
[array([ 0., 4., nan, 8., 6.])]
186-
187-
>>> import datetime
188-
>>> import pytest
189-
>>> pa = pytest.importorskip("pyarrow")
190-
>>> vectors = [
191-
... pd.Series(
192-
... data=[datetime.date(2020, 1, 1), datetime.date(2021, 12, 31)],
193-
... dtype="date32[day][pyarrow]",
194-
... ),
195-
... pd.Series(
196-
... data=[datetime.date(2022, 1, 1), datetime.date(2023, 12, 31)],
197-
... dtype="date64[ms][pyarrow]",
198-
... ),
199-
... ]
200-
>>> arrays = vectors_to_arrays(vectors)
201-
>>> all(a.flags.c_contiguous for a in arrays)
202-
True
203-
>>> all(isinstance(a, np.ndarray) for a in arrays)
204-
True
205-
>>> all(isinstance(a.dtype, np.dtypes.DateTime64DType) for a in arrays)
170+
>>> all(i.ndim == 1 for i in arrays)
206171
True
207172
"""
208173
dtypes = {

pygmt/tests/test_clib_conversion.py

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
"""
2+
Test the functions in the clib.conversion module.
3+
"""
4+
5+
import datetime
6+
import importlib
7+
8+
import numpy as np
9+
import numpy.testing as npt
10+
import pandas as pd
11+
import pytest
12+
from pygmt.clib.conversion import vectors_to_arrays
13+
14+
try:
15+
importlib.util.find_spec("pyarrow")
16+
_HAS_PYARROW = True
17+
except ImportError:
18+
_HAS_PYARROW = False
19+
20+
21+
def _check_arrays(arrays):
22+
"""
23+
A helper function to check the results of vectors_to_arrays.
24+
25+
- Check if all arrays are C-contiguous
26+
- Check if all arrays are numpy arrays
27+
- Check if all arrays are 1-D
28+
"""
29+
# Check if all arrays are C-contiguous
30+
assert all(i.flags.c_contiguous for i in arrays)
31+
# Check if all arrays are numpy arrays
32+
assert all(isinstance(i, np.ndarray) for i in arrays)
33+
# Check if all arrays are 1-D
34+
assert all(i.ndim == 1 for i in arrays)
35+
36+
37+
@pytest.mark.parametrize(
38+
"vectors",
39+
[
40+
pytest.param([[1, 2], (3, 4), range(5, 7)], id="python_objects"),
41+
pytest.param(
42+
[np.array([1, 2]), np.array([3, 4]), np.array(range(5, 7))],
43+
id="numpy_arrays",
44+
),
45+
pytest.param([[1, 2], np.array([3, 4]), range(5, 7)], id="mixed"),
46+
pytest.param([1, 2, 3.0], id="scalars"),
47+
],
48+
)
49+
def test_vectors_to_arrays(vectors):
50+
"""
51+
Test the vectors_to_arrays function for various input types.
52+
"""
53+
arrays = vectors_to_arrays(vectors)
54+
_check_arrays(arrays)
55+
56+
57+
def test_vectors_to_arrays_not_c_contiguous():
58+
"""
59+
Test the vectors_to_arrays function with numpy arrays that are not C-contiguous.
60+
"""
61+
data = np.array([[1, 2], [3, 4], [5, 6]])
62+
vectors = [data[:, 0], data[:, 1]]
63+
assert all(not i.flags.c_contiguous for i in vectors)
64+
arrays = vectors_to_arrays(vectors)
65+
_check_arrays(arrays)
66+
67+
68+
def test_vectors_to_arrays_pandas_nan():
69+
"""
70+
Test the vectors_to_arrays function with pandas Series containing NaNs.
71+
"""
72+
vectors = [pd.Series(data=[0, 4, pd.NA, 8, 6], dtype=pd.Int32Dtype())]
73+
arrays = vectors_to_arrays(vectors)
74+
npt.assert_equal(arrays[0], np.array([0, 4, np.nan, 8, 6], dtype=np.float64))
75+
_check_arrays(arrays)
76+
77+
78+
def test_vectors_to_arrays_pandas_string():
79+
"""
80+
Test the vectors_to_arrays function with pandas Series containing datetime64.
81+
"""
82+
vectors = [
83+
pd.Series(["abc", "defhig"]),
84+
pd.Series(["abcdef", "123456"], dtype="string"),
85+
]
86+
arrays = vectors_to_arrays(vectors)
87+
assert all(isinstance(i.dtype, np.dtypes.StrDType) for i in arrays)
88+
_check_arrays(arrays)
89+
90+
91+
@pytest.mark.skipif(not _HAS_PYARROW, reason="pyarrow is not installed.")
92+
def test_vectors_to_arrays_pyarrow_datetime():
93+
"""
94+
Test the vectors_to_arrays function with pyarrow arrays containing datetime64.
95+
"""
96+
vectors = [
97+
pd.Series(
98+
data=[datetime.date(2020, 1, 1), datetime.date(2021, 12, 31)],
99+
dtype="date32[day][pyarrow]",
100+
),
101+
pd.Series(
102+
data=[datetime.date(2022, 1, 1), datetime.date(2023, 12, 31)],
103+
dtype="date64[ms][pyarrow]",
104+
),
105+
]
106+
arrays = vectors_to_arrays(vectors)
107+
assert all(isinstance(i.dtype, np.dtypes.DateTime64DType) for i in arrays)
108+
_check_arrays(arrays)

0 commit comments

Comments
 (0)