How to convert a molecule(s) to bitvector to matrix

I am new to Julia and trying to convert a list of molecules to a matrix. I am using rdkit, so far I’ve got

mol = RDKitMinimalLib.get_mol("CC(=O)Oc1ccccc1C(=O)O")
fp_details = Dict{String, Any}("nBits" => 512, "radius" => 2)
morgan_fp = Int8.(collect(RDKitMinimalLib.get_morgan_fp(mol, fp_details))) .-Int8(48)

I am appending an empty list.

list_of_vector = []

How can I convert this vector{Any} to a matrix{2x512}?

reshape(list_of_vector, (2,512))

In your particular example, you could also do

morgan_fp_mat = [morgan_fp' ; morgan_fp']   # or vcat(morgan_fp', morgan_fp')

Thanks but for this example I got this error ERROR: LoadError: DimensionMismatch(“new dimensions (2, 512) must be consistent with array size 2”)

In this case, the reshape command only works if the initial vector is of length 1024, because then you can reorder it into a matrix with column length 512. You can check the length of a vector with length(list_of_vector).

Here is the full example

morgan_fp = randn(512) # or the output you get from the first snippet of your post
length(morgan_fp) # = 512
list_of_vectors = []
length(list_of_vectors) # = 0
append!(list_of_vectors, morgan_fp)
append!(list_of_vectors, morgan_fp)
length(list_of_vectors) # = 1024
# now you can reshape
mat_morgan_fp = reshape(list_of_vectors, (2,512))

But the solution @SteffenPL posted is more elegant in this case.

Thanks this worked! I should do a bit more googling but say I had a long list of fingerprints how would I convert the code? What does apostrophe do to the vector

Great thanks for the extra working, this is also working for me. :grinning:

morgan_fp' is equivalent to transpose(morgan_fp)
It is needed, because in Julia vectors are column vectors by default. Concatenating along the vertical axis (vcat) requires you to pass in two row vectors of length 512 if your matrix is supposed to be of size 2 x 512 then.

1 Like