2013-06-01 57 views
9

Tôi có một mảng 2-D Numpy trong đó một cột có giá trị Boolean, tức là True/False. Tôi muốn chuyển nó thành số nguyên 10 tương ứng, làm cách nào tôi có thể thực hiện?Cách chuyển đổi từ mảng boolean thành mảng int trong python

Ví dụ: data[0::,2] của tôi là boolean, tôi đã cố gắng

data[0::,2]=int(data[0::,2]) 

, nhưng nó được đem lại cho tôi lỗi:

TypeError: only length-1 arrays can be converted to Python scalars

My 5 dòng đầu tiên của mảng là:

[['0', '3', 'True', '22', '1', '0', '7.25', '0'], 
['1', '1', 'False', '38', '1', '0', '71.2833', '1'], 
['1', '3', 'False', '26', '0', '0', '7.925', '0'], 
['1', '1', 'False', '35', '1', '0', '53.1', '0'], 
['0', '3', 'True', '35', '0', '0', '8.05', '0']] 
+2

Đây không thể là mảng 2D, vì trong mảng 2D, tất cả các phần tử đều có cùng loại. Có lẽ, bạn có một mảng có cấu trúc. Bạn có thể, xin vui lòng, hiển thị một vài hàng đầy đủ từ nó và 'dtype' của nó? – kirelagin

+1

OK, những dấu ngoặc kép đó sẽ gợi ý cho bạn rằng bạn đã có một chuỗi các chuỗi. Vì vậy, một lần nữa, trong tất cả các yếu tố của một mảng 2D phải có cùng loại. Bạn cần có [mảng có cấu trúc] (http://docs.scipy.org/doc/numpy/user/basics.rec.html) hoặc chỉ cần loại bỏ các thông số sần và sử dụng các danh sách Python thông thường. Tại sao bạn cần numpy và mục tiêu cuối cùng của bạn là gì? – kirelagin

+1

Thực ra tôi đang theo một hướng dẫn về dự án học máy sử dụng python, và khi tôi mới bắt đầu với python, tôi đang đối mặt với những khó khăn này, nó yêu cầu mảng numpy. Vì vậy, nó sẽ là tuyệt vời nếu bạn có thể cho tôi biết làm thế nào để chuyển đổi toàn bộ mảng này của chuỗi để nổi vì nó là rõ ràng rằng nó có thể được chuyển đổi để nổi (điều trị đúng như 1 và fase là 0). –

Trả lời

9

Ok, dễ nhất cách thay đổi loại mảng bất kỳ thành float đang thực hiện:

data.astype(float)

Sự cố với mảng của bạn là float('True') là lỗi vì không thể phân tích cú pháp 'True' làm số phao. Vì vậy, điều tốt nhất cần làm là sửa mã tạo mảng của bạn để tạo ra các float (hoặc, ít nhất, các chuỗi có các ký tự float hợp lệ) thay vì các bool.

Trong khi đó bạn có thể sử dụng chức năng này để sửa chữa mảng của bạn:

def boolstr_to_floatstr(v): 
    if v == 'True': 
     return '1' 
    elif v == 'False': 
     return '0' 
    else: 
     return v 

Và cuối cùng bạn chuyển đổi mảng của bạn như thế này:

new_data = np.vectorize(boolstr_to_floatstr)(data).astype(float) 
+0

Đó là lỗi: "không thể chuyển đổi chuỗi thành nổi:" –

+0

@AkashdeepSaluja Tôi đã kiểm tra kỹ mã và nó đang hoạt động đối với tôi. Bạn có thể vui lòng cập nhật câu hỏi của bạn với đầu ra chính xác của 'dữ liệu [: 5]'. – kirelagin

+0

Đầu ra trong câu hỏi là đầu ra chính xác, bạn có muốn cái gì khác không? –

1

Nếu tôi làm điều này trên nguồn dữ liệu thô của bạn, đó là các chuỗi:

data = [['0', '3', 'True', '22', '1', '0', '7.25', '0'], 
     ['1', '1', 'False', '38', '1', '0', '71.2833', '1'], 
     ['1', '3', 'False', '26', '0', '0', '7.925', '0'], 
     ['1', '1', 'False', '35', '1', '0', '53.1', '0'], 
     ['0', '3', 'True', '35', '0', '0', '8.05', '0']] 

data = [[eval(x) for x in y] for y in data] 

..và sau đó làm theo đó với:

data = [[float(x) for x in y] for y in data] 
# or this if you prefer: 
arr = numpy.array(data) 

.. khi sự cố được giải quyết. .. bạn thậm chí có thể làm nó như một lớp lót (tôi nghĩ rằng điều này làm cho ints, mặc dù, và nổi có lẽ là cần thiết): numpy.array ([[eval (x) cho x trong y] cho y trong dữ liệu])

..Tôi nghĩ vấn đề là việc giữ các chuỗi số của bạn là chuỗi và vì không phải tất cả các chuỗi của bạn đều là số, bạn không thể thực hiện chuyển đổi kiểu trên toàn bộ mảng. Ngoài ra, nếu bạn cố gắng thực hiện chuyển đổi kiểu chỉ trên các phần của mảng bằng "True" và "False", bạn không thực sự làm việc với các boolean, nhưng với các chuỗi. ..và những cách duy nhất tôi biết để thay đổi đó là thực hiện lệnh eval. ..well, bạn cũng có thể thực hiện việc này:

..đây là cách bạn tránh né, vốn vốn không an toàn. .. nhưng điều đó có thể không quan trọng, vì bạn có thể đang sử dụng nguồn dữ liệu đáng tin cậy.

1

Sử dụng ý tưởng @ kirelagin với ast.literal_eval

>>> import ast 
>>> import numpy as np 
>>> arr = np.array(
     [['0', '3', 'True', '22', '1', '0', '7.25', '0'], 
     ['1', '1', 'False', '38', '1', '0', '71.2833', '1'], 
     ['1', '3', 'False', '26', '0', '0', '7.925', '0'], 
     ['1', '1', 'False', '35', '1', '0', '53.1', '0'], 
     ['0', '3', 'True', '35', '0', '0', '8.05', '0']]) 
>>> np.vectorize(ast.literal_eval, otypes=[np.float])(arr) 
array([[ 0. , 3. , 1. , 22. , 1. , 0. , 
      7.25 , 0. ], 
     [ 1. , 1. , 0. , 38. , 1. , 0. , 
     71.2833, 1. ], 
     [ 1. , 3. , 0. , 26. , 0. , 0. , 
      7.925 , 0. ], 
     [ 1. , 1. , 0. , 35. , 1. , 0. , 
     53.1 , 0. ], 
     [ 0. , 3. , 1. , 35. , 0. , 0. , 
      8.05 , 0. ]]) 
3

boolarrayvariable.astype (int) hoạt động:

data = np.random.normal(0,1,(1,5)) 
threshold = 0 
test1 = (data>threshold) 
test2 = test1.astype(int) 

Output:

data = array([[ 1.766, -1.765, 2.576, -1.469, 1.69]]) 
test1 = array([[ True, False, True, False, True]], dtype=bool) 
test2 = array([[1, 0, 1, 0, 1]]) 
0

Cũ Q nhưng, để tham khảo - một bool có thể được chuyển đổi sang một int và một int vào một phao

dữ liệu [0 ::, 2] = data [0 ::, 2] .astype (int) .astype (float)

Các vấn đề liên quan