2013-04-25 27 views
6

Hãy xem xét những mảngBuộc chuyển đổi của mảng NumPy không phải số với NAN thay

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

Ràng buộc chuyển đổi sang một mảng float đặt ra một ngoại lệ

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

Liệu NumPy cung cấp bất kỳ cách hiệu quả để ép buộc điều này thành một mảng số, thay thế các giá trị không phải số bằng một cái gì đó giống như NAN?

Cách khác, có chức năng numpy hiệu quả tương đương với np.isnan, nhưng cũng kiểm tra các phần tử không phải là số không như chữ cái?

Trả lời

10

Bạn có thể chuyển đổi một mảng các chuỗi thành một mảng phao (với Nans) sử dụng np.genfromtxt:

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]) 

Trong Python3 bạn sẽ cần phải chuyển đổi các mảng byte đầu tiên, ví dụ như qua 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]) 

Đây là một cách để xác định "số" chuỗi:

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) 

Lưu ý rằng "số" là unicode có chứa ký tự chữ số chỉ - có nghĩa là, các ký tự có thuộc tính giá trị số Unicode. Nó không bao gồm dấu thập phân. Vì vậy, u'1.3' không được coi là "số".

+0

'np.genfromtxt' là hoàn hảo, cảm ơn! – ChrisB

+0

Câu trả lời này có thể cần sửa đổi cho python3 - Bạn sẽ nhận được 'TypeError: Không thể chuyển đổi đối tượng 'byte' thành str ngầm'. –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ: Cảm ơn bạn đã trưởng thành. Đã sửa với 'astype ('bytes')'. – unutbu

4

Nếu bạn tình cờ được sử dụng gấu trúc cũng bạn có thể sử dụng phương pháp 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 thể được sử dụng như nó vốn có đối với bất kỳ mảng 1D. Tuy nhiên, đối với bất kỳ mảng N-D tùy ý (N> 1), bạn có được điều này:

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

Vì vậy, bạn sẽ cần phải làm nhiều hơn một chút. Ví dụ:

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

Bây giờ, định hình lại, chuyển đổi, và sau đó tái Reshape:

In [341]: pd.to_numeric(a.reshape(-1,), errors='coerce').reshape(a.shape) 
Out[341]: 
array([[ 1. , 1.1, nan], 
     [ nan, 1. , 1.1]]) 
Các vấn đề liên quan