x = np.array(['1', '2', 'a'])
搭售轉換爲浮點陣列引發一個例外
x.astype(np.float)
ValueError: could not convert string to float: a
是否numpy的提供任何有效的方式來將它強制轉換爲數字數組,用NAN之類的東西替換非數字值?
另外,是否有一個高效的numpy功能相當於np.isnan
,但也測試非數字元素像字母?
x = np.array(['1', '2', 'a'])
搭售轉換爲浮點陣列引發一個例外
x.astype(np.float)
ValueError: could not convert string to float: a
是否numpy的提供任何有效的方式來將它強制轉換爲數字數組,用NAN之類的東西替換非數字值?
另外,是否有一個高效的numpy功能相當於np.isnan
,但也測試非數字元素像字母?
可以使用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'
不被視爲「數字」。
如果你碰巧使用的大熊貓,以及你可以使用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])
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]])
'np.genfromtxt'是完美的,謝謝! – ChrisB 2013-04-25 20:05:54
這個答案可能需要修改爲python3 - 你會得到'TypeError:不能'隱式轉換'字節'對象到str'。 – 2017-09-21 10:36:57
@cᴏʟᴅsᴘᴇᴇᴅ:感謝您的提醒。用'astype('字節')修復'。 – unutbu 2017-09-21 10:53:06