Raul Britto
Raul Britto

Reputation: 47

PyCall receving Numpy and convert to native types element

I'm having some difficulty to convert a numpy matrix to Julia array with native types. So here is my problem: I have a code that returns a numpy matrix with the firsts 73 columns are bool that represents a feature array and the last column the probability associated with the vector of features.

B = np.ndarray((10,74),dtype = object)
B[:,0:73] = int(0)
B[:,-1] = float(0)

And I have a Julia code that call and receive this numpy matrix

using PyCall
push!(pyimport("sys")["path"], pwd());
a = pyimport("main")
t = a.analyze()

However my variable t is is an Array of PyObject and I would like to convert the entire Array to have native types (bool and flop). Because I'll use these variable in JuMP module.

10×74 Array{PyObject,2}:
 PyObject True  PyObject False  PyObject True  PyObject False  PyObject False  …  PyObject False  PyObject False  PyObject 0.4842317916002127
 PyObject True  PyObject False  PyObject True  PyObject False  PyObject False     PyObject False  PyObject False  PyObject 0.4077830940988835
 PyObject True  PyObject False  PyObject True  PyObject False  PyObject False     PyObject False  PyObject False  PyObject 0.4134680134680136
 PyObject True  PyObject False  PyObject True  PyObject True   PyObject False     PyObject False  PyObject False  PyObject 0.8565891472868217
 PyObject True  PyObject False  PyObject True  PyObject True   PyObject False     PyObject False  PyObject False  PyObject 0.4753872053872055
 PyObject True  PyObject False  PyObject True  PyObject True   PyObject False  …  PyObject False  PyObject False  PyObject 0.5216037930323644
 PyObject True  PyObject False  PyObject True  PyObject True   PyObject False     PyObject False  PyObject False  PyObject 0.5216037930323644
 PyObject True  PyObject False  PyObject True  PyObject True   PyObject False     PyObject False  PyObject False  PyObject 0.4775252525252527
 PyObject True  PyObject False  PyObject True  PyObject True   PyObject False     PyObject False  PyObject False  PyObject 0.47481481481481497
 PyObject True  PyObject False  PyObject True  PyObject True   PyObject False     PyObject False  PyObject False  PyObject 0.5277056277056278

Upvotes: 3

Views: 425

Answers (1)

Paul Dydyshko
Paul Dydyshko

Reputation: 385

You cannot convert the entire matrix to have Union{Bool, Float64} type because Bool will be promoted to Float64

The best solution is to split up t to BitArray{2} and Vector{Float64} like this

m = BitArray(t[:,1:end-1])
col = Vector{Float64}(t[:,end])

Note that BitArray{N} type is used for arrays of boolean values instead of Array{Bool, N} somewhere, and somewhere not, it depends on operations to be performed on this array. You can get more info in the question

Upvotes: 1

Related Questions