2013-04-25 52 views
6

考慮陣列被迫與NAN更換非數字numpy的陣列的轉換

x = np.array(['1', '2', 'a'])

搭售轉換爲浮點陣列引發一個例外

x.astype(np.float) 
ValueError: could not convert string to float: a 

是否numpy的提供任何有效的方式來將它強制轉換爲數字數組,用NAN之類的東西替換非數字值?

另外,是否有一個高效的numpy功能相當於np.isnan,但也測試非數字元素像字母?

回答

10

可以使用np.genfromtxt字符串數組轉換爲浮動(與NaN的)數組:

In [83]: np.set_printoptions(precision=3, suppress=True) 

In [84]: np.genfromtxt(np.array(['1','2','3.14','1e-3','b','nan','inf','-inf'])) 
Out[84]: array([ 1. , 2. , 3.14 , 0.001, nan, nan, inf, -inf]) 

在Python3,您將需要數組字節先轉換,例如如通過np.astype()

In [18]: np.genfromtxt(np.array(['1','2','3.14','1e-3','b','nan','inf','-inf']).astype('bytes')) 
Out[18]: array([ 1. , 2. , 3.14 , 0.001, nan, nan, inf, -inf]) 

這裏有一個方法來識別 「數字」 的字符串:

In [34]: x 
Out[34]: 
array(['1', '2', 'a'], 
     dtype='|S1') 

In [35]: x.astype('unicode') 
Out[35]: 
array([u'1', u'2', u'a'], 
     dtype='<U1') 

In [36]: np.char.isnumeric(x.astype('unicode')) 
Out[36]: array([ True, True, False], dtype=bool) 

需要注意的是 「數字」 是指只包含數字字符一個Unicode - 也就是說,具有Unicode數值屬性的字符。它確實包含小數點而不是。所以u'1.3'不被視爲「數字」。

+0

'np.genfromtxt'是完美的,謝謝! – ChrisB 2013-04-25 20:05:54

+0

這個答案可能需要修改爲python3 - 你會得到'TypeError:不能'隱式轉換'字節'對象到str'。 – 2017-09-21 10:36:57

+0

@cᴏʟᴅsᴘᴇᴇᴅ:感謝您的提醒。用'astype('字節')修復'。 – unutbu 2017-09-21 10:53:06

4

如果你碰巧使用的大熊貓,以及你可以使用pd.to_numeric()方法:

In [1]: import numpy as np 

In [2]: import pandas as pd 

In [3]: x = np.array(['1', '2', 'a']) 

In [4]: pd.to_numeric(x, errors='coerce') 
Out[4]: array([ 1., 2., nan]) 
0

pd.to_numeric可以用作 - 爲任何一維數組。然而,對於任何任意N-d陣列(N> 1),你會得到這樣的:

TypeError: arg must be a list, tuple, 1-d array, or Series 

所以,你需要做的多一點。例如:

In [340]: a 
Out[340]: 
array([['1', '1.1', 'a'], 
     ['ab', '1', '1.1']], 
     dtype='<U32') 

現在,重塑,進行轉換,然後再重新塑造:

In [341]: pd.to_numeric(a.reshape(-1,), errors='coerce').reshape(a.shape) 
Out[341]: 
array([[ 1. , 1.1, nan], 
     [ nan, 1. , 1.1]])