This seems like something that can be done with indexing, but I haven't found the solution.
out is a 2D array is initialized to zeros. x is a 1D array whose values correspond to the columns of out. For each row in out, set out[row,x[row]] = 1. Here is working code: def orthogonal_mod (x, nbits): out = np.zeros ((len(x), 1<<nbits), dtype=complex) for e in range (len (x)): out[e,x[e]] = 1 return out
Any idea to do this without an explicit python loop?
On Thu, May 20, 2021 at 9:47 AM Neal Becker ndbecker2@gmail.com wrote:
This seems like something that can be done with indexing, but I haven't found the solution.
out is a 2D array is initialized to zeros. x is a 1D array whose values correspond to the columns of out. For each row in out, set out[row,x[row]] = 1. Here is working code: def orthogonal_mod (x, nbits): out = np.zeros ((len(x), 1<<nbits), dtype=complex) for e in range (len (x)): out[e,x[e]] = 1 return out
Any idea to do this without an explicit python loop?
i = np.arange(len(x)) j = x[i] out[i, j] = 1
Thanks!
On Thu, May 20, 2021 at 9:53 AM Robert Kern robert.kern@gmail.com wrote:
On Thu, May 20, 2021 at 9:47 AM Neal Becker ndbecker2@gmail.com wrote:
This seems like something that can be done with indexing, but I haven't found the solution.
out is a 2D array is initialized to zeros. x is a 1D array whose values correspond to the columns of out. For each row in out, set out[row,x[row]] = 1. Here is working code: def orthogonal_mod (x, nbits): out = np.zeros ((len(x), 1<<nbits), dtype=complex) for e in range (len (x)): out[e,x[e]] = 1 return out
Any idea to do this without an explicit python loop?
i = np.arange(len(x)) j = x[i] out[i, j] = 1
 Robert Kern _______________________________________________ NumPyDiscussion mailing list NumPyDiscussion@python.org https://mail.python.org/mailman/listinfo/numpydiscussion
Or as a oneliner:
out[np.arange(len(x)), x] = 1
If NEP 21 is accepted ( https://numpy.org/neps/nep0021advancedindexing.html) this would be even simpler:
out.vindex[:, x] = 1
Was there ever a decision about that NEP? I didn't follow the discussion too closely at the time.
On Thu, May 20, 2021 at 10:06 AM Neal Becker ndbecker2@gmail.com wrote:
Thanks!
On Thu, May 20, 2021 at 9:53 AM Robert Kern robert.kern@gmail.com wrote:
On Thu, May 20, 2021 at 9:47 AM Neal Becker ndbecker2@gmail.com wrote:
This seems like something that can be done with indexing, but I haven't found the solution.
out is a 2D array is initialized to zeros. x is a 1D array whose values correspond to the columns of out. For each row in out, set out[row,x[row]] = 1. Here is working code: def orthogonal_mod (x, nbits): out = np.zeros ((len(x), 1<<nbits), dtype=complex) for e in range (len (x)): out[e,x[e]] = 1 return out
Any idea to do this without an explicit python loop?
i = np.arange(len(x)) j = x[i] out[i, j] = 1
 Robert Kern _______________________________________________ NumPyDiscussion mailing list NumPyDiscussion@python.org https://mail.python.org/mailman/listinfo/numpydiscussion
 Those who don't understand recursion are doomed to repeat it _______________________________________________ NumPyDiscussion mailing list NumPyDiscussion@python.org https://mail.python.org/mailman/listinfo/numpydiscussion
On Thu, May 20, 2021 at 1:40 PM CJ Carey perimosocordiae@gmail.com wrote:
Or as a oneliner:
out[np.arange(len(x)), x] = 1
Ah, right. `x[arange(len(x))]` is a noop.
If NEP 21 is accepted ( https://numpy.org/neps/nep0021advancedindexing.html) this would be even simpler:
out.vindex[:, x] = 1
Was there ever a decision about that NEP? I didn't follow the discussion too closely at the time.
IIRC, I think there was broad agreement on the final plan as stated in the NEP. I suspect, though, that the general appetite for adding to the array API surface has declined even from its anemic starting point, now that deep learning frameworks with ndarraymimicking APIs have taken off.
On Thu, 20210520 at 13:46 0400, Robert Kern wrote:
On Thu, May 20, 2021 at 1:40 PM CJ Carey perimosocordiae@gmail.com wrote:
<snip>
If NEP 21 is accepted ( https://numpy.org/neps/nep0021advancedindexing.html) this would be even simpler:
out.vindex[:, x] = 1
Was there ever a decision about that NEP? I didn't follow the discussion too closely at the time.
IIRC, I think there was broad agreement on the final plan as stated in the NEP. I suspect, though, that the general appetite for adding to the array API surface has declined even from its anemic starting point, now that deep learning frameworks with ndarraymimicking APIs have taken off.
True, I am not sure on which side we would land now. Although, NumPy's advanced indexing is too odd to expect ndarraymimicking APIs to copy it. At least with new attributes you have a chance to define clearly what should happen.
I personally still have appetite for it. But expect there will be enough "small" things to fixup (improve the NEP, figure out how subclassing should be done, cleanup the old code) that this is still a decent sized project. The old 8020 problem, I guess...
So, it just never quite reached the motivation/priority threshold for me since the original push.
Cheers,
Sebastian
NumPyDiscussion mailing list NumPyDiscussion@python.org https://mail.python.org/mailman/listinfo/numpydiscussion
participants (4)

CJ Carey

Neal Becker

Robert Kern

Sebastian Berg