Olga Mu
Olga Mu

Reputation: 916

Converting numpy string array to float: Bizarre?

So, this should be a really straightforward thing but for whatever reason, nothing I'm doing to convert an array of strings to an array of floats is working.

I have a two column array, like so:

Name    Value
Bob     4.56
Sam     5.22
Amy     1.22

I try this:

for row in myarray[1:,]:
     row[1]=float(row[1])

And this:

for row in myarray[1:,]:
    row[1]=row[1].astype(1)

And this:

myarray[1:,1] = map(float, myarray[1:,1])

And they all seem to do something, but when I double check:

type(myarray[9,1])

I get

<type> 'numpy.string_'>

Upvotes: 5

Views: 11469

Answers (2)

Benjamin
Benjamin

Reputation: 609

The type of the objects in a numpy array is determined at the initialsation of that array. If you want to change that later, you must cast the array, not the objects within that array.

myNewArray = myArray.asType(float)

Note: Upcasting is possible, for downcasting you need the astype method. For further information see:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html http://docs.scipy.org/doc/numpy/reference/generated/numpy.chararray.astype.html

Upvotes: 0

askewchan
askewchan

Reputation: 46578

Numpy arrays must have one dtype unless it is structured. Since you have some strings in the array, they must all be strings.

If you wish to have a complex dtype, you may do so:

import numpy as np
a = np.array([('Bob','4.56'), ('Sam','5.22'),('Amy', '1.22')], dtype = [('name','S3'),('val',float)])

Note that a is now a 1d structured array, where each element is a tuple of type dtype.

You can access the values using their field name:

In [21]: a = np.array([('Bob','4.56'), ('Sam','5.22'),('Amy', '1.22')],
    ...:         dtype = [('name','S3'),('val',float)])

In [22]: a
Out[22]: 
array([('Bob', 4.56), ('Sam', 5.22), ('Amy', 1.22)], 
      dtype=[('name', 'S3'), ('val', '<f8')])

In [23]: a['val']
Out[23]: array([ 4.56,  5.22,  1.22])

In [24]: a['name']
Out[24]: 
array(['Bob', 'Sam', 'Amy'], 
      dtype='|S3')

Upvotes: 7

Related Questions