Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement advanced indexing (and mixed basic/advanced) #4638

Closed
aselle opened this issue Sep 28, 2016 · 47 comments
Closed

Implement advanced indexing (and mixed basic/advanced) #4638

aselle opened this issue Sep 28, 2016 · 47 comments
Labels
stat:contribution welcome Status - Contributions welcome type:feature Feature requests

Comments

@aselle
Copy link
Contributor

aselle commented Sep 28, 2016

NumPy style advanced indexing is documented here http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#advanced-indexing

We currently support basic indexing http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#basic-slicing-and-indexing
using StridedSlice.

e.g.

foo = Some tensor
idx1=[1,2,3]
idx2=[3,4,5]
foo[idx1, idx2, 3]

@aselle aselle self-assigned this Sep 28, 2016
@aselle
Copy link
Contributor Author

aselle commented Sep 28, 2016

Broken off of #206

@shoyer
Copy link
Contributor

shoyer commented Sep 28, 2016

I mentioned this in #206, but I wanted to remind again that mixed indexing with slices/arrays has some really strange/unpredictable behavior for the order of result axes in NumPy. So it might be better to hold off on implementing that in TensorFlow until we're sure we're doing it right.

@aselle
Copy link
Contributor Author

aselle commented Sep 28, 2016

Yes, I am aware of how the mixed advanced/basic indexing is super nonintuitive. I could break the mixed indexing into its own issue.

@yaroslavvb
Copy link
Contributor

idx1/idx2 in your example could be Tensor objects, right?

@Rob-Haslinger-Bose
Copy link

does .10 currently support negative indexing? as in X[:,-1] for example?

@aselle
Copy link
Contributor Author

aselle commented Oct 11, 2016

@yaroslavvb: yes, idx1 andidx2 can be tensor objects. even in what is already implemented for baisc indexing, you can do

a=tf.constant(3); 
b=tf.constant(6);
foo[a:b]

@robsync: negative indices have a bug in 0.10 and work in 0.11rc0

@Fenugreek
Copy link
Contributor

@aselle: I saw in #206 according to your 7/12 comment that lvalue basic indexing has been implemented. But what does that mean? Because whenever I do any kind of lvalue indexing

e.g.

foo = Some tensor
foo[:3] = tf.zeros(3)

I get TypeError: 'Tensor' object does not support item assignment.
Thanks.

@shoyer
Copy link
Contributor

shoyer commented Oct 26, 2016

@Fenugreek Tensors are immutable. But you can do this sort of thing if foo is a tf.Variable by writing foo[:3].assign(tf.zeros(3))

@danijar
Copy link
Contributor

danijar commented Oct 26, 2016

...and making sure that it gets executed:

with tf.control_dependencies([foo[:3].assign(tf.zeros(3))]):
    foo = tf.identity(foo)

@Fenugreek
Copy link
Contributor

Great, thanks @shoyer and @danijar . I am past that problem now, but have another error with the basic indexing:

        print pool.get_shape(), args.get_shape(), values.get_shape()
        tf.assign(pool[args], values)

gives

(1024000,) (512000,) (512000,)
Traceback (most recent call last):
...
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/array_ops.py", line 1644, in _DelegateStridedSliceShape
    return common_shapes.call_cpp_shape_fn(op, input_tensors_needed=[1, 2, 3])
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/common_shapes.py", line 596, in call_cpp_shape_fn
    raise ValueError(err.message)
ValueError: Shape must be rank 1 but is rank 2

There are no rank 2 shapes anywhere, so I am confused. The same error results even if I just do a return pool[args], so has nothing to do with the assignment but with the basic indexing itself. Thanks again.

@aselle aselle added type:feature Feature requests and removed enhancement labels Feb 9, 2017
@charlienash
Copy link

I'm having a similar error to @Fenugreek:

A = tf.constant([[1,2],[3,4],[5,6]])
id_rows = tf.constant([0,2])
A[id_rows, :]

gives an error:

ValueError: Shape must be rank 1 but is rank 2 for 'strided_slice' 
(op: 'StridedSlice') with input shapes: [3,2], [1,2], [1,2], [1].

This is using version 1.0.0. Thanks.

@aselle
Copy link
Contributor Author

aselle commented Mar 8, 2017

You need to manually broadcast it i.e. values.get_shape() must match pool[args].get_shape. This is a limitation in the current implementation.

@aselle aselle added stat:awaiting response Status - Awaiting response from author and removed stat:awaiting response Status - Awaiting response from author labels Mar 8, 2017
@Kublai-Jing
Copy link

@aselle Can you elaborate more on how to manually broadcast to make it work ? Thanks.

@shoyer
Copy link
Contributor

shoyer commented Apr 4, 2017 via email

@cancan101
Copy link
Contributor

@cancan101
Copy link
Contributor

@itsmeolivia why was the issue closed? It doesn't seem like the example in the OP works.

@itsmeolivia
Copy link
Contributor

This question is better asked on StackOverflow since it is not a bug or feature request. There is also a larger community that reads questions there. Thanks!

@cancan101
Copy link
Contributor

I'm asking why the ticket was closed given the op was in fact a feature. Was it implemented? Or decided to not implement. There is no info in the ticket as to why it was closed.

@brianwa84
Copy link
Contributor

@aselle probably want to keep this open right?

@danijar danijar reopened this Jul 6, 2017
@SpinachR
Copy link

SpinachR commented Aug 8, 2017

I have realize the advanced indexing like the same way in numpy. Please refer to:
https://github.com/SpinachR/ubuntuTest/blob/master/beautifulCodes/tensorflow_advanced_index_slicing.ipynb

@tensorflowbutler
Copy link
Member

Nagging Assigneee: It has been 14 days with no activity and this issue has an assignee. Please update the label and/or status accordingly.

@tensorflowbutler
Copy link
Member

Nagging Assignee: It has been 14 days with no activity and this issue has an assignee. Please update the label and/or status accordingly.

@yifeif
Copy link
Contributor

yifeif commented Feb 8, 2018

@aselle do you know if we have plan to implement this? If not, should we mark this as contribution welcome?

@asimshankar
Copy link
Contributor

CC @saxenasaurabh

@traveller59
Copy link

use gather to do advanced index need much more code than numpy/pytorch, and make code hard to read. please implement this if possible.
I have implemented a simple function to do some numpy-style advanced indexing based on tf.gather_nd and tf.transpose.

@tensorflowbutler
Copy link
Member

Nagging Assignee @aselle: It has been 14 days with no activity and this issue has an assignee. Please update the label and/or status accordingly.

2 similar comments
@tensorflowbutler
Copy link
Member

Nagging Assignee @aselle: It has been 14 days with no activity and this issue has an assignee. Please update the label and/or status accordingly.

@tensorflowbutler
Copy link
Member

Nagging Assignee @aselle: It has been 14 days with no activity and this issue has an assignee. Please update the label and/or status accordingly.

@tensorflowbutler
Copy link
Member

Nagging Assignee @aselle: It has been 14 days with no activity and this issue has an assignee. Please update the label and/or status accordingly.

@aselle aselle added the stat:contribution welcome Status - Contributions welcome label Apr 25, 2018
@aselle
Copy link
Contributor Author

aselle commented Apr 25, 2018

@saxenasaurabh, could you take this issue over?

@aselle
Copy link
Contributor Author

aselle commented Apr 25, 2018

@saxenasaurabh, could you please take this issue over?

@aselle aselle assigned saxenasaurabh and unassigned aselle Apr 25, 2018
@tensorflowbutler
Copy link
Member

Please remove the assignee, as this issue is inviting external contributions. Otherwise, remove the contributions welcome label. Thank you.

4 similar comments
@tensorflowbutler
Copy link
Member

Please remove the assignee, as this issue is inviting external contributions. Otherwise, remove the contributions welcome label. Thank you.

@tensorflowbutler
Copy link
Member

Please remove the assignee, as this issue is inviting external contributions. Otherwise, remove the contributions welcome label. Thank you.

@tensorflowbutler
Copy link
Member

Please remove the assignee, as this issue is inviting external contributions. Otherwise, remove the contributions welcome label. Thank you.

@tensorflowbutler
Copy link
Member

Please remove the assignee, as this issue is inviting external contributions. Otherwise, remove the contributions welcome label. Thank you.

@gokul-uf
Copy link

@aselle Is there active development on this front or is using tf Eager the less painful way to go?

Thanks!

@asimshankar
Copy link
Contributor

@gokul-uf - Nope, this is not being actively developed at this time. Not quite sure if using eager helps you either. You could easily convert a Tensor to numpy and use advanced indexing, but if you want to compute gradients through that indexing, that won't work.

@shoyer
Copy link
Contributor

shoyer commented Jul 26, 2018 via email

@sathyarr
Copy link

@Fenugreek Tensors are immutable. But you can do this sort of thing if foo is a tf.Variable by writing foo[:3].assign(tf.zeros(3))

I have been trying to replace one of the tf.py_func. Please refer this for clear description of the problem.

I'm stuck on replacing tensor's values which is created as an Object and not a Variable.
Any workarounds possible for this case?

Similar Stack Overflow Question

@un-lock-me
Copy link

Is it doable something like this in tensorflow:

out[a2[y], x[:, None]] = alp[a2[y], x[:, None]]

please refer to this post for reproducble example.

Thanks

@aselle
Copy link
Contributor Author

aselle commented Jan 13, 2022

This issue is way to broad and stale. However, anyone needing advanced indexing functionality should consider the excellent tf.experimental.numpy` module by @wangpengmit

@aselle aselle closed this as completed Jan 13, 2022
@wangpengmit
Copy link
Member

wangpengmit commented Aug 31, 2022

(CCing @cantonios)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
stat:contribution welcome Status - Contributions welcome type:feature Feature requests
Projects
None yet
Development

No branches or pull requests