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)
We can add value to an array by using the append(), extend() and the insert (i,x) functions.
Adding values at the end of the array is a necessary task especially when the data is not fixed and is prone to change. For this task we can use numpy. append(). This function can help us to append a single value as well as multiple values at the end of the array.
We can access elements of an array using the index operator [] . All you need do in order to access a particular element is to call the array you created. Beside the array is the index [] operator, which will have the value of the particular element's index position from a given array.
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,))])
It appears to be a recognized bug in Numpy. There is discussion there of possible fixes, but the bug is still open.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With