Re: [Numpy-discussion] Can't seem to use np.insert() or np.append() for structured arrays

2014-08-30 Thread Sebastian Berg
On Sa, 2014-08-30 at 09:04 +0100, Sebastian Berg wrote:
> On Fr, 2014-08-29 at 22:10 -0400, Benjamin Root wrote:
> > Consider the following:
> > 
> > a = np.array([(1, 'a'), (2, 'b'), (3, 'c')], dtype=[('foo', 'i'),
> > ('bar', 'a1')])
> > 
> > b = np.append(a, (4, 'd'))
> > Traceback (most recent call last):
> >   File "", line 1, in 
> >   File
> > "/home/ben/miniconda/lib/python2.7/site-packages/numpy/lib/function_base.py",
> >  line 3555, in append
> > return concatenate((arr, values), axis=axis)
> > TypeError: invalid type promotion
> > b = np.insert(a, 4, (4, 'd'))
> > Traceback (most recent call last):
> >   File "", line 1, in 
> >   File
> > "/home/ben/miniconda/lib/python2.7/site-packages/numpy/lib/function_base.py",
> >  line 3464, in insert
> > new[slobj] = values
> > ValueError: could not convert string to float: d
> > 
> 

Actually, for insert it is easy to fix
(https://github.com/numpy/numpy/pull/5022), for append there are some
difficulties, because the dtype is not forced to be the arrays dtype,
but gotten from both the original and the appended value currently.

- Sebastian


> Ooops, nice bug in there, might have been me :) (will open a PR). 
> 
> - Sebastian
> 
> > 
> > In my original code snippet I was developing which has a more involved
> > dtype, I actually got a different exception:
> > b = np.append(a, c)
> > Traceback (most recent call last):
> >   File "", line 1, in 
> >   File
> > "/home/ben/miniconda/lib/python2.7/site-packages/numpy/lib/function_base.py",
> >  line 3553, in append
> > values = ravel(values)
> >   File
> > "/home/ben/miniconda/lib/python2.7/site-packages/numpy/core/fromnumeric.py",
> >  line 1367, in ravel
> > return asarray(a).ravel(order)
> >   File
> > "/home/ben/miniconda/lib/python2.7/site-packages/numpy/core/numeric.py", 
> > line 460, in asarray
> > return array(a, dtype, copy=False, order=order)
> > ValueError: setting an array element with a sequence.
> > 
> > 
> > Luckily, this works as a work-around:
> > >>> b = np.append(a, np.array([(4, 'd')], dtype=a.dtype))
> > >>> b
> > array([(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')], 
> >   dtype=[('foo', 'i'), ('bar', 'S1')])
> > 
> > 
> > 
> > The same happens whether I enclose the value with square bracket or
> > not. I suspect that this array type just wasn't considered when its
> > checking logic was developed. This is with 1.8.2 from miniconda.
> > Should we consider this a bug or are structured arrays just not
> > expected to be modified like this?
> > 
> > 
> > Cheers!
> > 
> > Ben Root
> > 
> > ___
> > NumPy-Discussion mailing list
> > NumPy-Discussion@scipy.org
> > http://mail.scipy.org/mailman/listinfo/numpy-discussion
> 
> 
> ___
> NumPy-Discussion mailing list
> NumPy-Discussion@scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion
> 


___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] Can't seem to use np.insert() or np.append() for structured arrays

2014-08-30 Thread Sebastian Berg
On Fr, 2014-08-29 at 22:10 -0400, Benjamin Root wrote:
> Consider the following:
> 
> a = np.array([(1, 'a'), (2, 'b'), (3, 'c')], dtype=[('foo', 'i'),
> ('bar', 'a1')])
> 
> b = np.append(a, (4, 'd'))
> Traceback (most recent call last):
>   File "", line 1, in 
>   File
> "/home/ben/miniconda/lib/python2.7/site-packages/numpy/lib/function_base.py", 
> line 3555, in append
> return concatenate((arr, values), axis=axis)
> TypeError: invalid type promotion
> b = np.insert(a, 4, (4, 'd'))
> Traceback (most recent call last):
>   File "", line 1, in 
>   File
> "/home/ben/miniconda/lib/python2.7/site-packages/numpy/lib/function_base.py", 
> line 3464, in insert
> new[slobj] = values
> ValueError: could not convert string to float: d
> 

Ooops, nice bug in there, might have been me :) (will open a PR). 

- Sebastian

> 
> In my original code snippet I was developing which has a more involved
> dtype, I actually got a different exception:
> b = np.append(a, c)
> Traceback (most recent call last):
>   File "", line 1, in 
>   File
> "/home/ben/miniconda/lib/python2.7/site-packages/numpy/lib/function_base.py", 
> line 3553, in append
> values = ravel(values)
>   File
> "/home/ben/miniconda/lib/python2.7/site-packages/numpy/core/fromnumeric.py", 
> line 1367, in ravel
> return asarray(a).ravel(order)
>   File
> "/home/ben/miniconda/lib/python2.7/site-packages/numpy/core/numeric.py", line 
> 460, in asarray
> return array(a, dtype, copy=False, order=order)
> ValueError: setting an array element with a sequence.
> 
> 
> Luckily, this works as a work-around:
> >>> b = np.append(a, np.array([(4, 'd')], dtype=a.dtype))
> >>> b
> array([(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')], 
>   dtype=[('foo', 'i'), ('bar', 'S1')])
> 
> 
> 
> The same happens whether I enclose the value with square bracket or
> not. I suspect that this array type just wasn't considered when its
> checking logic was developed. This is with 1.8.2 from miniconda.
> Should we consider this a bug or are structured arrays just not
> expected to be modified like this?
> 
> 
> Cheers!
> 
> Ben Root
> 
> ___
> NumPy-Discussion mailing list
> NumPy-Discussion@scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion


___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] Can't seem to use np.insert() or np.append() for structured arrays

2014-08-29 Thread Charles R Harris
On Fri, Aug 29, 2014 at 8:10 PM, Benjamin Root  wrote:

> Consider the following:
>
> a = np.array([(1, 'a'), (2, 'b'), (3, 'c')], dtype=[('foo', 'i'), ('bar',
> 'a1')])
> b = np.append(a, (4, 'd'))
> Traceback (most recent call last):
>   File "", line 1, in 
>   File
> "/home/ben/miniconda/lib/python2.7/site-packages/numpy/lib/function_base.py",
> line 3555, in append
> return concatenate((arr, values), axis=axis)
> TypeError: invalid type promotion
> b = np.insert(a, 4, (4, 'd'))
> Traceback (most recent call last):
>   File "", line 1, in 
>   File
> "/home/ben/miniconda/lib/python2.7/site-packages/numpy/lib/function_base.py",
> line 3464, in insert
> new[slobj] = values
> ValueError: could not convert string to float: d
>
> In my original code snippet I was developing which has a more involved
> dtype, I actually got a different exception:
> b = np.append(a, c)
> Traceback (most recent call last):
>   File "", line 1, in 
>   File
> "/home/ben/miniconda/lib/python2.7/site-packages/numpy/lib/function_base.py",
> line 3553, in append
> values = ravel(values)
>   File
> "/home/ben/miniconda/lib/python2.7/site-packages/numpy/core/fromnumeric.py",
> line 1367, in ravel
> return asarray(a).ravel(order)
>   File
> "/home/ben/miniconda/lib/python2.7/site-packages/numpy/core/numeric.py",
> line 460, in asarray
> return array(a, dtype, copy=False, order=order)
> ValueError: setting an array element with a sequence.
>
> Luckily, this works as a work-around:
> >>> b = np.append(a, np.array([(4, 'd')], dtype=a.dtype))
> >>> b
> array([(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')],
>   dtype=[('foo', 'i'), ('bar', 'S1')])
>
> The same happens whether I enclose the value with square bracket or not. I
> suspect that this array type just wasn't considered when its checking logic
> was developed. This is with 1.8.2 from miniconda. Should we consider this a
> bug or are structured arrays just not expected to be modified like this?
>
>
Could be one of many bug reports related to assignment to structured types.
Can you try using `x`?

In [25]: x = array([(4, 'd')], dt)[0]

In [26]: type(x)
Out[26]: numpy.void

In [27]: x
Out[27]: (4, 'd')

Chuck
___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion