On 19 February 2013 00:25, Mike Gran <[email protected]> wrote: > From: Noah Lavine <[email protected]> >>Hello, >>>On Wed 23 Jan 2013 13:20, Daniel Llorens <[email protected]> writes: >>> >>>> In [2]: a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) >>> >>>> In [4]: a[1] >>>> Out[4]: array([4, 5, 6]) >>>> In [5]: a[1, 1] >>>> Out[5]: 5 >>>> >>>> array-ref can be extended very simply to do that. It accumulates on the >>>> position as it is done now, but if the index list comes up short it >>>> makes a shared array with the remaining axes instead of giving a rank >>>> error. So it shouldn't be any slower than array_ref. >>> >>>It could make sense, yes. What do others think? What happens for >>>array-set!? Care to propose a patch? >> >> >> I haven't worked with the array functionality, so I might be missing >> something, but I don't see why this is natural for array-ref.
Right, these are my sentiments also (including the snipped part). Relaxing array-ref in the proposed way means it could hide programming errors, etc. Particularly with typed arrays, where previously the result will reliably be of the given type. > > One could imagine a Matlab-like syntax where array-ref has to have > the same number of indices as the underlying array, but, if an > index were replaced with a symbol, it would return a slice. > > if np is [[1, 2, 3], [4, 5, 6], [7, 8, 9]] > (array-ref np 1 1) -> 5 > (array-ref np 1 :) -> [4, 5, 6] > (array-ref np : 1) -> [[2], [5], [8]] > > Or maybe that's already in Scheme. I'll admit I've never done matrices > in scheme. Yes, but please lets imagine this only and not multiply the purpose of array-ref. Other languages do that kind of thing a lot with a sort of “guess what I really meant to do and do that instead”, which leads to messy documentation, programming errors, and security issues (Ruby-on-Rails?). This is certainly a common enough usage of make-shared-array to justify its own procedure with more helpful syntax. Even I would make this two procedures, array-slice and array-slice/shared, to decide between new or shared array. Regards
