Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Assigning values to a NumPy array

Tags:

python

numpy

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)

like image 974
Joel Vroom Avatar asked Oct 21 '14 13:10

Joel Vroom


People also ask

How do you assign a value to an array in Python?

We can add value to an array by using the append(), extend() and the insert (i,x) functions.

Can you append values to NumPy array?

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.

How do you access individual elements of an array in Python?

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.


2 Answers

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,))])
like image 160
Wolph Avatar answered Sep 21 '22 11:09

Wolph


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

like image 28
BrenBarn Avatar answered Sep 22 '22 11:09

BrenBarn