Skip to content

Commit 584f6da

Browse files
committed
fixed X.axis_name[groups] when groups have the same axis name (closes #787)
i.e. when the operation was not actually needed
1 parent 1eff988 commit 584f6da

File tree

3 files changed

+107
-25
lines changed

3 files changed

+107
-25
lines changed
Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,13 @@
11
.. py:currentmodule:: larray
22

33

4-
Syntax changes
5-
^^^^^^^^^^^^^^
6-
7-
* renamed ``LArray.old_method_name()`` to :py:obj:`LArray.new_method_name()` (closes :issue:`1`).
8-
9-
* renamed ``old_argument_name`` argument of :py:obj:`LArray.method_name()` to ``new_argument_name``.
10-
11-
12-
Backward incompatible changes
13-
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
14-
15-
* other backward incompatible changes
16-
17-
184
New features
195
^^^^^^^^^^^^
206

217
* added the :py:obj:`ExcelReport` class allowing to generate multiple graphs in an
228
Excel file at once (closes :issue:`676`).
239

2410

25-
.. _misc:
26-
27-
Miscellaneous improvements
28-
^^^^^^^^^^^^^^^^^^^^^^^^^^
29-
30-
* improved the performance of a few LArray methods.
31-
32-
3311
Fixes
3412
^^^^^
3513

@@ -39,3 +17,6 @@ Fixes
3917
* fixed taking a subset of an array with boolean labels for an axis if the user explicitly specify the axis
4018
(closes :issue:`735`). When the user does not specify the axis, it currently fails but it is unclear what to do in
4119
that case (see :issue:`794`).
20+
21+
* fixed a regression in 0.30: X.axis_name[groups] failed when groups were originally defined on axes with the same name
22+
(i.e. when the operation was not actually needed). Closes :issue:`787`.

larray/core/axis.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -758,7 +758,10 @@ def isscalar(k):
758758
list_res = [self[k] for k in key]
759759
return list_res if isinstance(key, list) else tuple(list_res)
760760
# allow targeting a label from an aggregated axis with the group which created it
761-
elif (isinstance(key, Group) and isinstance(key.axis, Axis) and key.axis.name == self.name and
761+
elif (not isinstance(self, AxisReference) and
762+
isinstance(key, Group) and
763+
isinstance(key.axis, Axis) and
764+
key.axis.name == self.name and
762765
key.name in self):
763766
return LGroup(key.name, None, self)
764767
# elif isinstance(key, basestring) and key in self:

larray/tests/test_axis.py

Lines changed: 100 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
import numpy as np
77

88
from larray.tests.common import assert_array_equal, assert_nparray_equal
9-
from larray import Axis, LGroup, IGroup, read_hdf
9+
from larray import Axis, LGroup, IGroup, read_hdf, X
10+
from larray.core.axis import AxisReference
1011

1112

1213
def test_init():
@@ -98,7 +99,7 @@ def test_translate():
9899

99100
def test_getitem_lgroup_keys():
100101
def group_equal(g1, g2):
101-
return (g1.key == g2.key and g1.name == g2.name and g1.axis is g2.axis)
102+
return g1.key == g2.key and g1.name == g2.name and g1.axis is g2.axis
102103

103104
age = Axis(range(100), 'age')
104105
ages = [1, 5, 9]
@@ -119,93 +120,125 @@ def group_equal(g1, g2):
119120
def test_getitem_group_keys():
120121
a = Axis('a=a0..a2')
121122
alt_a = Axis('a=a1..a3')
123+
122124
key = a['a1']
125+
123126
g = a[key]
124127
assert g.key == 'a1'
125128
assert g.axis is a
129+
126130
g = alt_a[key]
127131
assert g.key == 'a1'
128132
assert g.axis is alt_a
133+
129134
key = a['a1':'a2']
135+
130136
g = a[key]
131137
assert g.key == slice('a1', 'a2')
132138
assert g.axis is a
139+
133140
g = alt_a[key]
134141
assert g.key == slice('a1', 'a2')
135142
assert g.axis is alt_a
143+
136144
key = a[['a1', 'a2']]
145+
137146
g = a[key]
138147
assert g.key == ['a1', 'a2']
139148
assert g.axis is a
149+
140150
g = alt_a[key]
141151
assert g.key == ['a1', 'a2']
142152
assert g.axis is alt_a
153+
143154
key = a.i[1]
155+
144156
g = a[key]
145157
assert isinstance(g, LGroup)
146158
assert g.key == 'a1'
147159
assert g.axis is a
160+
148161
g = alt_a[key]
149162
assert isinstance(g, LGroup)
150163
assert g.key == 'a1'
151164
assert g.axis is alt_a
165+
152166
key = a.i[1:3]
167+
153168
g = a[key]
154169
assert isinstance(g, LGroup)
155170
assert g.key == slice('a1', 'a2')
156171
assert g.axis is a
172+
157173
g = alt_a[key]
158174
assert isinstance(g, LGroup)
159175
assert g.key == slice('a1', 'a2')
160176
assert g.axis is alt_a
177+
161178
key = a.i[[1, 2]]
179+
162180
g = a[key]
163181
assert isinstance(g, LGroup)
164182
assert list(g.key) == ['a1', 'a2']
165183
assert g.axis is a
184+
166185
g = alt_a[key]
167186
assert isinstance(g, LGroup)
168187
assert list(g.key) == ['a1', 'a2']
169188
assert g.axis is alt_a
189+
170190
lg_a1 = a['a1']
171191
lg_a2 = a['a2']
192+
172193
g = a[lg_a1:lg_a2]
173194
assert isinstance(g, LGroup)
174195
assert g.key == slice('a1', 'a2')
175196
assert g.axis is a
197+
176198
g = alt_a[lg_a1:lg_a2]
177199
assert isinstance(g, LGroup)
178200
assert g.key == slice('a1', 'a2')
179201
assert g.axis is alt_a
202+
180203
pg_a1 = a.i[1]
181204
pg_a2 = a.i[2]
205+
182206
g = a[pg_a1:pg_a2]
183207
assert isinstance(g, LGroup)
184208
assert g.key == slice('a1', 'a2')
185209
assert g.axis is a
210+
186211
g = alt_a[pg_a1:pg_a2]
187212
assert isinstance(g, LGroup)
188213
assert g.key == slice('a1', 'a2')
189214
assert g.axis is alt_a
215+
190216
key = [a['a1'], a['a2']]
217+
191218
g = a[key]
192219
assert isinstance(g, LGroup)
193220
assert g.key == ['a1', 'a2']
194221
assert g.axis is a
222+
195223
g = alt_a[key]
196224
assert isinstance(g, LGroup)
197225
assert g.key == ['a1', 'a2']
198226
assert g.axis is alt_a
227+
199228
key = [a.i[1], a.i[2]]
229+
200230
g = a[key]
201231
assert isinstance(g, LGroup)
202232
assert g.key == ['a1', 'a2']
203233
assert g.axis is a
234+
204235
g = alt_a[key]
205236
assert isinstance(g, LGroup)
206237
assert g.key == ['a1', 'a2']
207238
assert g.axis is alt_a
239+
208240
key = [a['a1', 'a2'], a['a2', 'a1']]
241+
209242
g = a[key]
210243
assert isinstance(g, list)
211244
assert isinstance(g[0], LGroup)
@@ -214,6 +247,7 @@ def test_getitem_group_keys():
214247
assert g[1].key == ['a2', 'a1']
215248
assert g[0].axis is a
216249
assert g[1].axis is a
250+
217251
g = alt_a[key]
218252
assert isinstance(g, list)
219253
assert isinstance(g[0], LGroup)
@@ -222,7 +256,9 @@ def test_getitem_group_keys():
222256
assert g[1].key == ['a2', 'a1']
223257
assert g[0].axis is alt_a
224258
assert g[1].axis is alt_a
259+
225260
key = (a.i[1, 2], a.i[2, 1])
261+
226262
g = a[key]
227263
assert isinstance(g, tuple)
228264
assert isinstance(g[0], LGroup)
@@ -231,6 +267,7 @@ def test_getitem_group_keys():
231267
assert list(g[1].key) == ['a2', 'a1']
232268
assert g[0].axis is a
233269
assert g[1].axis is a
270+
234271
g = alt_a[key]
235272
assert isinstance(g, tuple)
236273
assert isinstance(g[0], LGroup)
@@ -239,25 +276,33 @@ def test_getitem_group_keys():
239276
assert list(g[1].key) == ['a2', 'a1']
240277
assert g[0].axis is alt_a
241278
assert g[1].axis is alt_a
279+
242280
key = (a['a1'], a['a2'])
281+
243282
g = a[key]
244283
assert isinstance(g, LGroup)
245284
assert g.key == ['a1', 'a2']
246285
assert g.axis is a
286+
247287
g = alt_a[key]
248288
assert isinstance(g, LGroup)
249289
assert g.key == ['a1', 'a2']
250290
assert g.axis is alt_a
291+
251292
key = (a.i[1], a.i[2])
293+
252294
g = a[key]
253295
assert isinstance(g, LGroup)
254296
assert g.key == ['a1', 'a2']
255297
assert g.axis is a
298+
256299
g = alt_a[key]
257300
assert isinstance(g, LGroup)
258301
assert g.key == ['a1', 'a2']
259302
assert g.axis is alt_a
303+
260304
key = (a['a1', 'a2'], a['a2', 'a1'])
305+
261306
g = a[key]
262307
assert isinstance(g, tuple)
263308
assert isinstance(g[0], LGroup)
@@ -266,6 +311,7 @@ def test_getitem_group_keys():
266311
assert g[1].key == ['a2', 'a1']
267312
assert g[0].axis is a
268313
assert g[1].axis is a
314+
269315
g = alt_a[key]
270316
assert isinstance(g, tuple)
271317
assert isinstance(g[0], LGroup)
@@ -274,7 +320,9 @@ def test_getitem_group_keys():
274320
assert g[1].key == ['a2', 'a1']
275321
assert g[0].axis is alt_a
276322
assert g[1].axis is alt_a
323+
277324
key = (a.i[1, 2], a.i[2, 1])
325+
278326
g = a[key]
279327
assert isinstance(g, tuple)
280328
assert isinstance(g[0], LGroup)
@@ -283,6 +331,7 @@ def test_getitem_group_keys():
283331
assert list(g[1].key) == ['a2', 'a1']
284332
assert g[0].axis is a
285333
assert g[1].axis is a
334+
286335
g = alt_a[key]
287336
assert isinstance(g, tuple)
288337
assert isinstance(g[0], LGroup)
@@ -293,6 +342,55 @@ def test_getitem_group_keys():
293342
assert g[1].axis is alt_a
294343

295344

345+
def test_axis_ref_getitem_group_keys():
346+
# test that we can retarget a key to another axis using an axis ref
347+
348+
# a) when the name of the axis is different
349+
axis1 = Axis('axis1=a0..a2')
350+
351+
g = X.axis2[axis1['a1']]
352+
assert isinstance(g.key, str) and g.key == 'a1'
353+
assert isinstance(g.axis, AxisReference)
354+
assert g.axis.name == 'axis2'
355+
356+
g = X.axis2[axis1['a1'], axis1['a2']]
357+
assert isinstance(g.key, list) and g.key == ['a1', 'a2']
358+
assert isinstance(g.axis, AxisReference)
359+
assert g.axis.name == 'axis2'
360+
361+
g = X.axis2[[axis1['a1'], axis1['a2']]]
362+
assert isinstance(g.key, list) and g.key == ['a1', 'a2']
363+
assert isinstance(g.axis, AxisReference)
364+
assert g.axis.name == 'axis2'
365+
366+
g = X.axis2[axis1['a1':'a2']]
367+
assert isinstance(g.key, slice) and g.key == slice('a1', 'a2')
368+
assert isinstance(g.axis, AxisReference)
369+
assert g.axis.name == 'axis2'
370+
371+
# b) when the name of the axis is the same (i.e. when the retarget is useless)
372+
# this is what issue #787 was all about
373+
g = X.axis1[axis1['a1']]
374+
assert isinstance(g.key, str) and g.key == 'a1'
375+
assert isinstance(g.axis, AxisReference)
376+
assert g.axis.name == 'axis1'
377+
378+
g = X.axis1[axis1['a1'], axis1['a2']]
379+
assert isinstance(g.key, list) and g.key == ['a1', 'a2']
380+
assert isinstance(g.axis, AxisReference)
381+
assert g.axis.name == 'axis1'
382+
383+
g = X.axis1[[axis1['a1'], axis1['a2']]]
384+
assert isinstance(g.key, list) and g.key == ['a1', 'a2']
385+
assert isinstance(g.axis, AxisReference)
386+
assert g.axis.name == 'axis1'
387+
388+
g = X.axis1[axis1['a1':'a2']]
389+
assert isinstance(g.key, slice) and g.key == slice('a1', 'a2')
390+
assert isinstance(g.axis, AxisReference)
391+
assert g.axis.name == 'axis1'
392+
393+
296394
def test_init_from_group():
297395
code = Axis('code=C01..C03')
298396
code_group = code[:'C02']

0 commit comments

Comments
 (0)