9

Can someone explain to me why attempt #1 does not work?

import numpy as np    
x = np.zeros(1, dtype=np.dtype([('field', '<f8', (1,2))]))

Attempt #1:

x[0]['field'] = np.array([3.,4.], dtype=np.double)
print x, '\n'

[([[ 3. 0.]])] (why was only the '3' copied over?)

Attempt #2:

x['field'][0] = np.array([3.,4.], dtype=np.double)
print x

[([[ 3. 4.]])] (this worked)

1
  • 1
    this seem to be an issue with __setitem__(), because x[0:]['field'] = ... works! Even x[0:999999]['field'] = ..., using very high indices, which are simply ignored... Commented Oct 25, 2014 at 18:34

2 Answers 2

2

To be honest... I'm not sure I'm getting the results either. It seems inconsistent/broken. Part of it is due to inconsistent shapes but not all of it. Some data seems to be disappearing.

For example (note the shapes):

In [1]: import numpy as np

In [2]: x = np.zeros(1, dtype=np.dtype([('field', '<f8', (1, 2))]))

In [3]: y = x[0]['field'].copy()

In [4]: y[0] = 3

In [5]: y[1] = 4
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-5-cba72439f97c> in <module>()
----> 1 y[1] = 4

IndexError: index 1 is out of bounds for axis 0 with size 1

In [6]: y[0][1] = 4

In [7]: x
Out[7]:
array([([[0.0, 0.0]],)],
      dtype=[('field', '<f8', (1, 2))])

In [8]: y
Out[8]: array([[ 3.,  4.]])

In [9]: x[0]['field'] = y

In [10]: x
Out[10]:
array([([[3.0, 0.0]],)],
      dtype=[('field', '<f8', (1, 2))])

So... to make it easier to grasp, let's make the shape simpler.

In [1]: import numpy as np

In [2]: x = np.zeros(1, dtype=np.dtype([('field', '<f8', 2)]))

In [3]: y = x[0]['field'].copy()

In [4]: y[0] = 3

In [5]: y[1] = 4

In [6]: x[0]['field'] = y

In [7]: x
Out[7]:
array([([3.0, 0.0],)],
      dtype=[('field', '<f8', (2,))])

In [8]: y
Out[8]: array([ 3.,  4.])

Where the data is going in this case... not a clue. Assigning in a way that the data does get stored seems easily possible though.

Several options:

In [9]: x['field'][0] = y

In [10]: x
Out[10]:
array([([3.0, 4.0],)],
      dtype=[('field', '<f8', (2,))])

In [11]: x['field'] = y * 2

In [12]: x
Out[12]:
array([([6.0, 8.0],)],
      dtype=[('field', '<f8', (2,))])

In [13]: x['field'][:] = y

In [14]: x
Out[14]:
array([([3.0, 4.0],)],
      dtype=[('field', '<f8', (2,))])

In [15]: x[0]['field'][:] = y * 2

In [16]: x
Out[16]:
array([([6.0, 8.0],)],
      dtype=[('field', '<f8', (2,))])
Sign up to request clarification or add additional context in comments.

Comments

2
+50

It appears to be a recognized bug in Numpy. There is discussion there of possible fixes, but the bug is still open.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.