| 172 | |
| 173 | |
| 174 | class ndarray: |
| 175 | def __init__(self, t=None): |
| 176 | if t is None: |
| 177 | self.tensor = torch.Tensor() |
| 178 | elif isinstance(t, torch.Tensor): |
| 179 | self.tensor = t |
| 180 | else: |
| 181 | raise ValueError( |
| 182 | "ndarray constructor is not recommended; prefer" |
| 183 | "either array(...) or zeros/empty(...)" |
| 184 | ) |
| 185 | |
| 186 | # Register NumPy functions as methods |
| 187 | for method, name in methods.items(): |
| 188 | fn = getattr(_funcs, name or method) |
| 189 | vars()[method] = create_method(fn, method) |
| 190 | |
| 191 | # Regular methods but coming from ufuncs |
| 192 | conj = create_method(_ufuncs.conjugate, "conj") |
| 193 | conjugate = create_method(_ufuncs.conjugate) |
| 194 | |
| 195 | for method, name in dunder.items(): |
| 196 | fn = getattr(_ufuncs, name or method) |
| 197 | method = f"__{method}__" |
| 198 | vars()[method] = create_method(fn, method) |
| 199 | |
| 200 | for method, name in ri_dunder.items(): |
| 201 | fn = getattr(_ufuncs, name or method) |
| 202 | plain = f"__{method}__" |
| 203 | vars()[plain] = create_method(fn, plain) |
| 204 | rvar = f"__r{method}__" |
| 205 | vars()[rvar] = create_method(lambda self, other, fn=fn: fn(other, self), rvar) |
| 206 | ivar = f"__i{method}__" |
| 207 | vars()[ivar] = create_method( |
| 208 | lambda self, other, fn=fn: fn(self, other, out=self), ivar |
| 209 | ) |
| 210 | |
| 211 | # There's no __idivmod__ |
| 212 | __divmod__ = create_method(_ufuncs.divmod, "__divmod__") |
| 213 | __rdivmod__ = create_method( |
| 214 | lambda self, other: _ufuncs.divmod(other, self), "__rdivmod__" |
| 215 | ) |
| 216 | |
| 217 | # prevent loop variables leaking into the ndarray class namespace |
| 218 | del ivar, rvar, name, plain, fn, method |
| 219 | |
| 220 | @property |
| 221 | def shape(self): |
| 222 | return tuple(self.tensor.shape) |
| 223 | |
| 224 | @property |
| 225 | def size(self): |
| 226 | return self.tensor.numel() |
| 227 | |
| 228 | @property |
| 229 | def ndim(self): |
| 230 | return self.tensor.ndim |
| 231 |
no test coverage detected
searching dependent graphs…