[Numpy-discussion] Request for a bit more info on structured arrays in the "basics" page

Skipper Seabold jsseabold at gmail.com
Wed Mar 9 20:37:48 EST 2011


On Wed, Mar 9, 2011 at 8:13 PM, Ralf Gommers
<ralf.gommers at googlemail.com> wrote:
> On Wed, Mar 9, 2011 at 11:24 PM, Skipper Seabold <jsseabold at gmail.com> wrote:
>> On Tue, Mar 8, 2011 at 8:08 PM, Skipper Seabold <jsseabold at gmail.com> wrote:
>>> On Sun, Mar 6, 2011 at 11:12 PM, Ralf Gommers
>>> <ralf.gommers at googlemail.com> wrote:
>>>> On Sun, Mar 6, 2011 at 1:10 AM, Skipper Seabold <jsseabold at gmail.com> wrote:
>>>>> On Sat, Mar 5, 2011 at 9:28 AM, Ralf Gommers
>>>>> <ralf.gommers at googlemail.com> wrote:
>>>>>> On Sat, Mar 5, 2011 at 8:09 AM, Russell E. Owen <rowen at uw.edu> wrote:
>>>>>>> The page <http://docs.scipy.org/doc/numpy/user/basics.rec.html>
>>>>>>>
>>>>>>> gives a good introduction to structured arrays. However, it says nothing
>>>>>>> about how to set a particular element (all fields at once) from a
>>>>>>> collection of data.
>>>>>>>
>>>>>>> For instance:
>>>>>>>
>>>>>>> stArr = numpy.zeros([4,5], dtype=[("pos", float, (2,)), ("rot", float)])
>>>>>>>
>>>>>>> The question is how to set stArr[0]?
>>>>>>>
>>>>>>> >From experimentation it appears that you can provide a tuple, but not a
>>>>>>> list. Hence the following works just fine (and that the tuple can
>>>>>>> contain a list):
>>>>>>> strArr[0,0] = ([1.0, 1.1], 2.0)
>>>>>>>
>>>>>>> but the following fails:
>>>>>>> strArr[0,0] = [[1.0, 1.1], 2.0]
>>>>>>> with an error:
>>>>>>> TypeError: expected a readable buffer object
>>>>>>>
>>>>>>> This is useful information if one is trying to initialize a structured
>>>>>>> array from a collection of data, such as that returned from a database
>>>>>>> query.
>>>>>>>
>>>>>
>>>>> I added a bit at the end here, though it is mentioned briefly above.
>>>>> Feel free to expand. It's a wiki. You just need edit rights.
>>>>>
>>>>> http://docs.scipy.org/numpy/docs/numpy.doc.structured_arrays/
>>>>
>>>> Thanks, I'll make sure that goes in for 1.6.0.
>>>>
>>>>>> I'm wondering if that's not a bug? If it's intentional then it is
>>>>>> certainly counterintuitive.
>>>>>>
>>>>>
>>>>> This comes up from time to time.
>>>>>
>>>>> http://thread.gmane.org/gmane.comp.python.numeric.general/30793/focus=30793
>>>>>
>>>>> Perhaps an enhancement ticket could be filed? It doesn't sound trivial
>>>>> to implement.
>>>>
>>>> I filed #1758.
>>>>
>>>> You can also assign with an array which fails silently, certainly a bug:
>>>>
>>>>>>> arr = np.zeros((5,), dtype=[('var1','f8'),('var2','f8')])
>>>>>>> arr['var1'] = np.arange(5)
>>>>>>> arr[0] = (10,20)
>>>>>>> arr[0]
>>>> (10.0, 20.0)
>>>>
>>>>>>> arr[0] = np.array([10,20])  # no exception, but garbage out
>>>>>>> arr[0]
>>>> (4.2439915824246103e-313, 0.0)
>>>>
>>>
>>> This is a casting issue. Your array is an integer array. You can
>>> assign with an array.
>>>
>>> arr = np.zeros((5,), dtype=[('var1','f8'),('var2','f8')])
>>> arr[0] = np.array([10.0,20])
>>> arr[0]
>>> (10.0, 20.0)
>>>
>>
>> FYI, I fixed the docs to reflect this.
>
> Thanks, the doc is accurate now. Although I'm not sure we want to
> document a bug (which I'm still sure it is) like that without making
> clear it it is a bug.
>
>> I know numpy is already pretty verbose by default, but should the
>> integer case throw up a warning similar to casting from complex to
>> real?
>
> Please no, that will be very annoying. Plus it's much better defined
> then complex -> real.
>

I assume this is the same thing

x = np.array([1.5])
x.view(int)
array([4609434218613702656])

x = np.array([1])
x.view(float)
array([  4.94065646e-324])

I've been bit by this before, so I know not to do it, but I think it
would be nice if it threw up a "don't try do that!".

Skipper



More information about the NumPy-Discussion mailing list