On Wed, Jan 26, 2011 at 8:29 PM, Joshua Holbrook <josh.holbr...@gmail.com>wrote:
> >> > >> The only disadvantage I see, is that choosing the axes to operate on > >> in a program or function requires string manipulation. > > > > > > One possibility would be for the Python exposure to accept lists or > tuples > > of integers. The subscript 'ii' could be [(0,0)], and 'ij,jk->ik' could > be > > [(0,1), (1,2), (0,2)]. Internally it would convert this directly to a > > C-string to pass to the API function. > > -Mark > > > > What if you made objects i, j, etc. such that i*j = (0, 1) and > etcetera? Maybe you could generate them with something like (i, j, k) > = einstein((1, 2, 3)) . > > Feel free to disregard me since I haven't really thought too hard > about things and might not even really understand what the problem is > *anyway*. I'm just trying to help brainstorm. :) > No worries. :) The problem is that someone will probably want to dynamically generate the axes to process in a loop, rather than having them hardcoded beforehand. For example, generalizing the diag function as follows. Within Python, creating lists and tuples is probably more natural. -Mark >>> def diagij(x, i, j): ... ss = "" ... so = "" ... # should error check i, j ... fill = ord('b') ... for k in range(x.ndim): ... if k in [i, j]: ... ss += 'a' ... else: ... ss += chr(fill) ... so += chr(fill) ... fill += 1 ... ss += '->' + so + 'a' ... return np.einsum(ss, x) ... >>> x = np.arange(3*3*3).reshape(3,3,3) >>> diagij(x, 0, 1) array([[ 0, 12, 24], [ 1, 13, 25], [ 2, 14, 26]]) >>> [np.diag(x[:,:,i]) for i in range(3)] [array([ 0, 12, 24]), array([ 1, 13, 25]), array([ 2, 14, 26])] >>> diagij(x, 1, 2) array([[ 0, 4, 8], [ 9, 13, 17], [18, 22, 26]])
_______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion