def __setitem__(self, key, value): """Sets values based on `key`. All the functionality of ``ndarray.__setitem__()`` is supported (including fancy indexing), plus a special support for expressions. Parameters ---------- key : string, int, tuple, slice If string and it matches a column name, this will be set to `value`. If string, but not a column name, it will be interpreted as a boolean expression (computed via `ctable.eval`) and the rows where these values are true will be set to `value`. If int or slice, then the corresponding rows will be set to `value`. value : object The values to be set. See Also -------- ctable.eval """ if isinstance(key, (bytes, str)): # First, check if the key is a column name if key in self.names: # Yes, so overwrite it self.cols[key] = value return # Else, convert value into a structured array value = utils.to_ndarray(value, self.dtype) # Check if key is a condition actually if isinstance(key, (bytes, str)): # Convert key into a boolean array # key = self.eval(key) # The method below is faster (specially for large ctables) rowval = 0 for nrow in self.where(key, outcols=["nrow__"]): nrow = nrow[0] if len(value) == 1: for name in self.names: self.cols[name][nrow] = value[name] else: for name in self.names: self.cols[name][nrow] = value[name][rowval] rowval += 1 return # key should int or slice, so modify the rows for name in self.names: self.cols[name][key] = value[name] return
def __setitem__(self, key, value): """ x.__setitem__(key, value) <==> x[key] = value Sets values based on `key`. All the functionality of ``ndarray.__setitem__()`` is supported (including fancy indexing), plus a special support for expressions: Parameters ---------- key : string The corresponding ctable column name will be set to `value`. If not a column name, it will be interpret as a boolean expression (computed via `ctable.eval`) and the rows where these values are true will be set to `value`. See Also -------- ctable.eval """ # First, convert value into a structured array value = utils.to_ndarray(value, self.dtype) # Check if key is a condition actually if type(key) is bytes: # Convert key into a boolean array # key = self.eval(key) # The method below is faster (specially for large ctables) rowval = 0 for nrow in self.where(key, outcols=["nrow__"]): nrow = nrow[0] if len(value) == 1: for name in self.names: self.cols[name][nrow] = value[name] else: for name in self.names: self.cols[name][nrow] = value[name][rowval] rowval += 1 return # Then, modify the rows for name in self.names: self.cols[name][key] = value[name] return