Seconding Jaime; I use this trick in mesh manipulations a lot as well.
There are a lot of graph-type manipulations you can express effectively in
numpy using np.unique and related functionality.


On Sun, Feb 2, 2014 at 11:57 PM, Jaime Fernández del Río <
jaime.f...@gmail.com> wrote:

> Cannot test right now, but np.unique(b, return_inverse=True)[1].reshape(2,
> -1) should do what you are after, I think.
>  On Feb 2, 2014 11:58 AM, "Mads Ipsen" <mads.ip...@gmail.com> wrote:
>
>> Hi,
>>
>> I have run into a potential 'for loop' bottleneck. Let me outline:
>>
>> The following array describes bonds (connections) in a benzene molecule
>>
>>     b = [[0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3,  4, 4, 4, 5,  5, 5, 6, 7,
>> 8, 9, 10, 11],
>>          [5, 6, 1, 0, 2, 7, 3, 8, 1, 4, 9, 2, 10, 5, 3, 4, 11, 0, 0, 1,
>> 2, 3,  4,  5]]
>>
>> ie. bond 0 connects atoms 0 and 5, bond 1 connects atom 0 and 6, etc. In
>> practical examples, the list can be much larger (N > 100.000 connections.
>>
>> Suppose atoms with indices a = [1,2,3,7,8] are deleted, then all bonds
>> connecting those atoms must be deleted. I achieve this doing
>>
>> i_0 = numpy.in1d(b[0], a)
>> i_1 = numpy.in1d(b[1], a)
>> b_i = numpy.where(i_0 | i_1)[0]
>> b = b[:,~(i_0 | i_1)]
>>
>> If you find this approach lacking, feel free to comment.
>>
>> This results in the following updated bond list
>>
>> b = [[0,  0,  4,  4,  5,  5,  5,  6, 10, 11]
>>      [5,  6, 10,  5,  4, 11,  0,  0,  4,  5]]
>>
>> This list is however not correct: Since atoms [1,2,3,7,8] have been
>> deleted, the remaining atoms with indices larger than the deleted atoms
>> must be decremented. I do this as follows:
>>
>> for i in a:
>>     b = numpy.where(b > i, bonds-1, bonds)  (*)
>>
>> yielding the correct result
>>
>> b = [[0, 0, 1, 1, 2, 2, 2, 3, 5, 6],
>>      [2, 3, 5, 2, 1, 6, 0, 0, 1, 2]]
>>
>> The Python for loop in (*) may easily contain 50.000 iteration. Is there
>> a smart way to utilize numpy functionality to avoid this?
>>
>> Thanks and best regards,
>>
>> Mads
>>
>> --
>> +---------------------------------------------------------+
>> | Mads Ipsen                                              |
>> +----------------------+----------------------------------+
>> | Gåsebæksvej 7, 4. tv | phone:              +45-29716388 |
>> | DK-2500 Valby        | email:      mads.ip...@gmail.com |
>> | Denmark              | map  :   www.tinyurl.com/ns52fpa |
>> +----------------------+----------------------------------+
>> _______________________________________________
>> NumPy-Discussion mailing list
>> NumPy-Discussion@scipy.org
>> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>>
>
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion@scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>
>
_______________________________________________
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion

Reply via email to