LSSTApplications  20.0.0
LSSTDataManagementBasePackage
_baseColumnView.py
Go to the documentation of this file.
1 # This file is part of afw.
2 #
3 # Developed for the LSST Data Management System.
4 # This product includes software developed by the LSST Project
5 # (https://www.lsst.org).
6 # See the COPYRIGHT file at the top-level directory of this distribution
7 # for details of code ownership.
8 #
9 # This program is free software: you can redistribute it and/or modify
10 # it under the terms of the GNU General Public License as published by
11 # the Free Software Foundation, either version 3 of the License, or
12 # (at your option) any later version.
13 #
14 # This program is distributed in the hope that it will be useful,
15 # but WITHOUT ANY WARRANTY; without even the implied warranty of
16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 # GNU General Public License for more details.
18 #
19 # You should have received a copy of the GNU General Public License
20 # along with this program. If not, see <https://www.gnu.org/licenses/>.
21 
22 __all__ = [] # importing this module adds methods to BaseColumnView
23 
24 import numpy as np
25 
26 from lsst.utils import continueClass
27 from ._table import KeyFlag, _BaseColumnViewBase
28 
29 # We can't call this "BaseColumnView" because that's the typedef for
30 # "ColumnViewT<BaseRecord>". This is just a mostly-invisible implementation
31 # base class, so we use the same naming convention we use for those.
32 
33 
34 @continueClass # noqa: F811
36 
37  def getBits(self, keys=None):
38  """Get the bits associated with the specified keys.
39 
40  Parameters
41  ----------
42  key : `str`
43  Key to retrieve. Unlike the C++ version, each key may be a
44  field name or a key, and if keys is `None` then all bits
45  are returned.
46 
47  Returns
48  -------
49  bits : `int`
50  Integer array of the requested bitmask.
51  """
52  if keys is None:
53  return self.getAllBits()
54  arg = []
55  for k in keys:
56  if isinstance(k, str):
57  arg.append(self.schema.find(k).key)
58  else:
59  arg.append(k)
60  return self._getBits(arg)
61 
62  def __getitem__(self, key):
63  """Get a column view; key may be a key object or the name of a field.
64  """
65  if isinstance(key, str):
66  keyobj = self.schema.find(key).key
67  else:
68  keyobj = key
69  return self._basicget(keyobj)
70 
71  get = __getitem__
72 
73  def __setitem__(self, key, value):
74  """Set a full column to an array or scalar; key may be a key object or
75  the name of a field.
76  """
77  self.get(key)[:] = value
78 
79  set = __setitem__
80 
81  def get_bool_array(self, key):
82  """Get the value of a flag column as a boolean array; key must be a
83  key object or the name of a field.
84 
85  Parameters
86  ----------
87  key : `lsst.afw.table.KeyFlag`
88  Flag column to search for.
89 
90  Returns
91  -------
92  value : `list` of `bool`
93  Array of booleans corresponding to the flag.
94 
95  Raises
96  ------
97  TypeError
98  Raised if the key is not a KeyFlag.
99  """
100  if isinstance(key, KeyFlag):
101  return self[key]
102  raise TypeError("key={} not an lsst.afw.table.KeyFlag".format(key))
103 
104  def extract(self, *patterns, **kwds):
105  """Extract a dictionary of {<name>: <column-array>} in which the field
106  names match the given shell-style glob pattern(s).
107 
108  Any number of glob patterns may be passed (including none); the result
109  will be the union of all the result of each glob considered
110  separately.
111 
112  Note that extract("*", copy=True) provides an easy way to transform a
113  row-major ColumnView into a possibly more efficient set of contiguous
114  NumPy arrays.
115 
116  This routines unpacks `Flag` columns into full boolean arrays and
117  covariances into dense (i.e. non-triangular packed) arrays with
118  dimension (N,M,M), where N is the number of records and M is the
119  dimension of the covariance matrix. String fields are silently
120  ignored.
121 
122  Parameters
123  ----------
124  patterns : Array of `str`
125  List of glob patterns to use to select field names.
126  kwds : `dict`
127  Dictionary of additional keyword arguments. May contain:
128  - ``items`` : `list`
129  The result of a call to self.schema.extract(); this
130  will be used instead of doing any new matching, and
131  allows the pattern matching to be reused to extract
132  values from multiple records. This keyword is
133  incompatible with any position arguments and the
134  regex, sub, and ordered keyword arguments.
135  - ``where`` : array index expression
136  Any expression that can be passed as indices to a
137  NumPy array, including slices, boolean arrays, and
138  index arrays, that will be used to index each column
139  array. This is applied before arrays are copied when
140  copy is True, so if the indexing results in an
141  implicit copy no unnecessary second copy is performed.
142  - ``copy`` : `bool`
143  If True, the returned arrays will be contiguous copies
144  rather than strided views into the catalog. This
145  ensures that the lifetime of the catalog is not tied
146  to the lifetime of a particular catalog, and it also
147  may improve the performance if the array is used
148  repeatedly. Default is False.
149  - ``regex`` : `str` or `re` pattern
150  A regular expression to be used in addition to any
151  glob patterns passed as positional arguments. Note
152  that this will be compared with re.match, not
153  re.search.
154  - ``sub`` : `str`
155  A replacement string (see re.MatchObject.expand) used
156  to set the dictionary keys of any fields matched by
157  regex.
158  - ``ordered`` : `bool`
159  If True, a collections.OrderedDict will be returned
160  instead of a standard dict, with the order
161  corresponding to the definition order of the
162  Schema. Default is False.
163 
164  Returns
165  -------
166  d : `dict`
167  Dictionary of extracted name-column array sets.
168 
169  Raises
170  ------
171  ValueError
172  Raised if a list of ``items`` is supplied with additional
173  keywords.
174  """
175  copy = kwds.pop("copy", False)
176  where = kwds.pop("where", None)
177  d = kwds.pop("items", None)
178  # If ``items`` is given as a kwd, an extraction has already been performed and there shouldn't be
179  # any additional keywords. Otherwise call schema.extract to load the
180  # dictionary.
181  if d is None:
182  d = self.schema.extract(*patterns, **kwds).copy()
183  elif kwds:
184  raise ValueError(
185  "kwd 'items' was specified, which is not compatible with additional keywords")
186 
187  def processArray(a):
188  if where is not None:
189  a = a[where]
190  if copy:
191  a = np.ascontiguousarray(a)
192  return a
193 
194  # must use list because we might be adding/deleting elements
195  for name, schemaItem in list(d.items()):
196  key = schemaItem.key
197  if key.getTypeString() == "String":
198  del d[name]
199  else:
200  d[name] = processArray(self.get(schemaItem.key))
201  return d
lsst::afw::table._baseColumnView._BaseColumnViewBase
Definition: _baseColumnView.py:35
lsst::afw::table._baseColumnView._BaseColumnViewBase.get
def get
Definition: _baseColumnView.py:71
lsst::afw::table._baseColumnView._BaseColumnViewBase.extract
def extract(self, *patterns, **kwds)
Definition: _baseColumnView.py:104
pex.config.history.format
def format(config, name=None, writeSourceLine=True, prefix="", verbose=False)
Definition: history.py:174
lsst::afw::table._baseColumnView._BaseColumnViewBase.getBits
def getBits(self, keys=None)
Definition: _baseColumnView.py:37
lsst::afw::table._baseColumnView._BaseColumnViewBase.__getitem__
def __getitem__(self, key)
Definition: _baseColumnView.py:62
lsst::utils
Definition: Backtrace.h:29
lsst::afw::table._baseColumnView._BaseColumnViewBase.__setitem__
def __setitem__(self, key, value)
Definition: _baseColumnView.py:73
list
daf::base::PropertyList * list
Definition: fits.cc:913
lsst::afw::table._baseColumnView._BaseColumnViewBase.get_bool_array
def get_bool_array(self, key)
Definition: _baseColumnView.py:81