msg198324 - (view) |
Author: PCManticore (Claudiu.Popa) *  |
Date: 2013-09-23 16:27 |
Hello. The following seems a little weird: Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:03:43) [MSC v.1600 32 bit (Intel)] on win32 >>> m = memoryview(b'123') >>> list(m[::-1]) [51, 50, 49] >>> list(reversed(m)) Traceback (most recent call last): File "", line 1, in TypeError: object of type 'memoryview' has no len() >>> The attached patch allows `reversed` to be called with memoryviews and it could potentially fix . |
|
|
msg198342 - (view) |
Author: Antoine Pitrou (pitrou) *  |
Date: 2013-09-23 20:52 |
So the dilemma with len() was: does it return the number of bytes, or the number of items? Given the new memoryview semantics, I'd say it should return the number of items. |
|
|
msg198348 - (view) |
Author: Alyssa Coghlan (ncoghlan) *  |
Date: 2013-09-23 23:08 |
Aye, with the 3.3 changes, I think we should continue down the multi-dimensional array path. I suggest we run with whatever NumPy uses for ndarray, which I believe is "number of items in the first dimension". |
|
|
msg198383 - (view) |
Author: PCManticore (Claudiu.Popa) *  |
Date: 2013-09-25 13:06 |
So, in the following case, len shouldn't return 4, but the number of items? Also, is it ok to assume that the number of items is ((*shape)[0] * ... * (*shape)[ndims-1])? >>> x = np.array([[1, 2, 3], [4, 5, 6], [4,5,6], [4,4,4]], np.int32) >>> x.shape (4, 3) >>> x.shape[0] * x.shape[1] 12 >>> len(x) 4 >>> memoryview(x) <memory at 0x0217C378> >>> len(memoryview(x)) 4 >>> memoryview(x).shape (4, 3) >>> |
|
|
msg198384 - (view) |
Author: Antoine Pitrou (pitrou) *  |
Date: 2013-09-25 13:46 |
No, you're right, it should probably return 4. |
|
|
msg198516 - (view) |
Author: Stefan Krah (skrah) *  |
Date: 2013-09-28 14:28 |
Yes, len() should return the number of items. +1 for making reversed() work. NumPy does this: >>> x = numpy.array([1,2,3,4,5,6,7,8]) >>> list(reversed(x)) [8, 7, 6, 5, 4, 3, 2, 1] >>> >>> x = numpy.array([[1,2,3], [4,5,6]]) >>> list(reversed(x)) [array([4, 5, 6]), array([1, 2, 3])] >>> |
|
|
msg198518 - (view) |
Author: Stefan Krah (skrah) *  |
Date: 2013-09-28 14:30 |
Hmm, I meant: Number of items in the first dimension, thus 4 in Claudiu's example. |
|
|
msg198566 - (view) |
Author: PCManticore (Claudiu.Popa) *  |
Date: 2013-09-29 06:22 |
For multidimensional arrays it doesn't seem to work (yet). >>> x = numpy.array([[1,2,3], [4,5,6]]) >>> list(reversed(x)) [array([4, 5, 6]), array([1, 2, 3])] >>> x.data <memory at 0x8032d06b8> >>> list(reversed(x.data)) Traceback (most recent call last): File "", line 1, in NotImplementedError: multi-dimensional sub-views are not implemented >>> |
|
|
msg198612 - (view) |
Author: Antoine Pitrou (pitrou) *  |
Date: 2013-09-29 17:28 |
Stefan, what do you think about Claudiu's patch? Should a test be added to test_buffer as well? |
|
|
msg198680 - (view) |
Author: Raymond Hettinger (rhettinger) *  |
Date: 2013-09-30 06:28 |
Claudiu's patch looks correct. |
|
|
msg198824 - (view) |
Author: Stefan Krah (skrah) *  |
Date: 2013-10-02 10:30 |
> Stefan, what do you think about Claudiu's patch? Should a test be added to test_buffer as well? I think the patch is good. We can add more tests when (if?) multi-dimensional support is added to memoryview. In that case we should probably do the same as NumPy and return a list of subviews. So testing against tolist() like in the test case will only work for one-dimensional views. I can't commit right now (the machine with my ssh-key won't have Internet access for some time), so if someone has time to do it ... |
|
|
msg198829 - (view) |
Author: Roundup Robot (python-dev)  |
Date: 2013-10-02 12:07 |
New changeset 0dc604d58949 by Nick Coghlan in branch 'default': Close #19078: memoryview now supports reversed http://hg.python.org/cpython/rev/0dc604d58949 |
|
|