[Numpy-discussion] Any help from Numpy community?
Ryan
rnelsonchem at gmail.com
Thu Mar 14 12:03:44 EDT 2013
Birdada Simret <birdada85 <at> gmail.com> writes:
>
>
>
> Hi Ryan,Thank you very much indeed, I'm not sure if I well understood your
code, let say, for the example array matrix given represents H3C-CH3
connection(bonding).
> the result from your code is:
> Rows: [0 0 0 0 1 1 1] # is these for C indices?
> Columns: [1 2 3 4 5 6 7] # is these for H indices? but it shouldn't be 6 H's?
> Atomic Distances: [ 1. 1. 1. 1. 1. 1. 1.] # ofcourse this is the number
of connections or bonds.
>
> In fact, if I write in the form of dictionary: row indices as keys and column
indices as values,
> {0:1, 0:2, 0:3, 0:4, 1:5, 1:6, 1:7}, So, does it mean C[0] is connected to
H[1], C[0] is connected to H[2] , H[1],....,C[1] is connected to H[7]? But I
have only 6 H's and two C's in this example (H3C-CH3)
>
> I have tried some thing like: but still no luck ;(
> import numpy as np
> from collections import defaultdict
> dict = defaultdict(list)
> x=....2d numpy array
>
> I = x.shape[0]
> J = x.shape[1]
> d={}
> for i in xrange(0, I, 1):
> for j in xrange(0, J, 1):
> if x[i,j] > 0:
> dict[i].append(j)
> # the result is:
> dict: {0: [1, 2, 3, 4], 1: [0, 5, 6, 7], 2: [0], 3: [0], 4: [0], 5: [1], 6:
[1], 7: [1]})
> keys: [0, 1, 2, 3, 4, 5, 6, 7]
> values: [[1, 2, 3, 4], [0, 5, 6, 7], [0], [0], [0], [1], [1], [1]]
>
>
> #The H indices can be found by
> H_rows = np.nonzero(x.sum(axis=1)== 1)
> result=>H_rows : [2, 3, 4, 5, 6, 7] # six H's
> I am trying to connect this indices with the dict result but I am confused!
> So, now I want to produce a dictionary or what ever to produce results as:
H[2] is connected to C[?]
>
H[3] is connected to C[?]
>
H[4] is connected to C[?], .....
> Thanks for any help
> .
>
>
> On Thu, Mar 14, 2013 at 2:26 PM, Ryan <rnelsonchem <at> gmail.com> wrote:
>
>
Birda,
I don't know how your getting those values from my code. Here's a slightly
modified and fully self-contained version that includes your bonding matrix:
import numpy as np
x = np.array(
[[ 0., 1.54, 0., 0., 0., 1.08, 1.08, 1.08 ],
[ 1.54, 0., 1.08, 1.08, 1.08, 0., 0., 0. ],
[ 0., 1.08, 0., 0., 0., 0., 0., 0. ],
[ 0., 1.08, 0., 0., 0., 0., 0., 0. ],
[ 0., 1.08, 0., 0., 0., 0., 0., 0. ],
[ 1.08, 0., 0., 0., 0., 0., 0., 0. ],
[ 1.08, 0., 0., 0., 0., 0., 0., 0. ],
[ 1.08, 0., 0., 0., 0., 0., 0., 0. ]]
)
atoms = np.array(['C1', 'C2', 'H3', 'H4', 'H5', 'H6', 'H7', 'H8'])
index = np.arange( x.size ).reshape( x.shape )
items = index[ x != 0 ]
rows = items / x.shape[0]
cols = items % x.shape[0]
mask = rows < cols
print 'Rows: ', rows[mask]
print 'Columns:', cols[mask]
print 'Bond Atom 1: ', atoms[ rows[mask] ]
print 'Bond Atom 2: ', atoms[ cols[mask] ]
print 'Atomic Distances:', x[rows[mask], cols[mask]]
If I copy that into a file and run it, I get the following output:
Rows: [0 0 0 0 1 1 1]
Columns: [1 5 6 7 2 3 4]
Bond Atom 1: ['C1' 'C1' 'C1' 'C1' 'C2' 'C2' 'C2']
Bond Atom 2: ['C2' 'H6' 'H7' 'H8' 'H3' 'H4' 'H5']
Atomic Distances: [ 1.54 1.08 1.08 1.08 1.08 1.08 1.08]
Honestly, I did not think about your code all that much. Too many 'for' loops
for my taste. My code has quite a bit of fancy indexing, which I could imagine
is also quite confusing.
If you really want a dictionary type of interface that still let's you use Numpy
magic, I would take a look at Pandas (http://pandas.pydata.org/)
Ryan
More information about the NumPy-Discussion
mailing list