public bool MoveNext() { if (current == null) { current = core; } return(core.MoveNext()); }
/// <summary> /// Multidimensional index iterator. /// </summary> /// <param name="a"></param> public ndenumerate(ndarray a) { core = np.asarray(a).Flat; }
private static ndarray Concatenate(IEnumerable <ndarray> arrays, int?axis = 0) { int i; bool MustFlatten = false; if (axis == null) { MustFlatten = true; axis = 0; } try { arrays.First(); } catch (InvalidOperationException) { throw new ArgumentException("concatenation of zero-length sequence is impossible"); } ndarray[] mps = NpyUtil_ArgProcessing.ConvertToCommonType(arrays); int n = mps.Length; if (MustFlatten) { // Flatten the arrays for (i = 0; i < n; i++) { mps[i] = mps[i].Ravel(NPY_ORDER.NPY_CORDER); } axis = 0; } else if (axis != 0) { // Swap to make the axis 0 for (i = 0; i < n; i++) { mps[i] = NpyCoreApi.FromArray(mps[i].SwapAxes(axis.Value, 0), null, NPYARRAYFLAGS.NPY_C_CONTIGUOUS); } } npy_intp[] dims = mps[0].dims; if (dims.Length == 0) { throw new ArgumentException("0-d arrays can't be concatenated"); } npy_intp new_dim = dims[0]; for (i = 1; i < n; i++) { npy_intp[] dims2 = mps[i].dims; if (dims.Length != dims2.Length) { throw new ArgumentException("arrays must have same number of dimensions"); } bool eq = Enumerable.Zip(dims.Skip(1), dims2.Skip(1), (a1, b) => (a1 == b)).All(x => x); if (!eq) { throw new ArgumentException("array dimensions do not agree"); } new_dim += dims2[0]; } dims[0] = new_dim; ndarray result = NpyCoreApi.AllocArray(mps[0].Dtype, dims.Length, dims, false); if (!result.Dtype.IsObject) { if (NpyCoreApi.CombineInto(result, mps) < 0) { throw new ArgumentException("unable to concatenate these arrays"); } } else { // Do a high-level copy to get the references right. long j = 0; flatiter flat = result.Flat; foreach (ndarray a1 in mps) { long size = a1.Size; flat[new Slice(j, j + size)] = a1.flat; j += size; } } if (0 < axis && axis < NpyDefs.NPY_MAXDIMS || axis < 0) { result = result.SwapAxes(axis.Value, 0); } return(result); }