Reputation: 63
I've found the following puzzling behavior with NumPy and a custom dtype for an ndarray:
import numpy as np
# Make a custom dtype with a single triplet of floats (my actual dtype has other
# components, but this suffices to demonstrate the problem.
dt = np.dtype([('a', np.float64, 3)])
# Make a zero array with this dtype:
points = np.zeros((4, 4), dtype=dt)
# Try to edit an entry:
points[0][0]['a'] = np.array([1, 1, 1])
print points[0][0]['a']
Now, this comes back as containing not [1. 1. 1.] as I would expect, but instead [1. 0. 0.], only performing the assignment on the first coordinate. I can get around this by performing the assignment coordinate-wise, but that seems unnecessary given that the full assignment should certainly be the default behavior in this case.
Any thoughts on what's going on here?
Upvotes: 6
Views: 610
Reputation: 97261
There are many method to assign points, if you want your method works:
points[0][0]['a'][:] = np.array([1, 1, 1])
or:
points[0,0]['a'][:] = np.array([1, 1, 1])
because points[0,0]['a'] is an array, if you want to change the content of the array, you shoud use index.
Upvotes: 2
Reputation: 26030
If you change the ordering of the indices, like this: points['a'][0][0] = np.array([1, 1, 1])
, it works ok for me (python 2.6.5, numpy 1.3.0 on Ubuntu 10.04). I wish I knew why.
Upvotes: 3