[yt-users] Problem with Units in a Derived Field

Nathan Goldbaum nathan12343 at gmail.com
Tue Aug 25 16:41:27 PDT 2015


On Tuesday, August 25, 2015, Jared Coughlin <Jared.W.Coughlin.29 at nd.edu>
wrote:

> Hello! I'm really sorry for the barrage of questions; hopefully this will
> be the last one!
> I now get the error:  operands could not be broadcast together with shapes
> (2072685,) (2153824,)
> on line: fHI = (recomb * ne) / (gamma_HI + (gamma_c * ne))
>
> I printed the shapes of all of those arrays, and this is what I get:
> nH.shape
> (16, 16, 16)
> ne.shape
> (16, 16, 16)
> gamma_c.shape
> (1,)
> recomb.shape
> (1,)
> nH.shape
> (2153824,)
> ne.shape
> (2153824,)
> gamma_c.shape
> (2072685,)
> recomb.shape
> (2072685,)
>
> Firstly, I'm a little confused as to why their dimensions change, but what
> really matters are the bottom ones.  I know how many gas particles are in
> my gadget simulation: 2072685.  All of the arrays were created from either
> data["Gas", "InternalEnergy"] or data["gas", "density"], which should, I
> would imagine, have the same dimensions: the number of gas particles.  I
> was just wondering if anyone had seen something like this before? The
> function in question was posted to a pastebin in an earlier email on this
> thread, and I have since made all of the arrays YTArrays, as suggested
> above. Thanks!
> -Jared
>
>
Hey Jared,

I looked above but can't seem to find the correct link for the script
you're using. Can you pastebin your updated script and the full error
tracrback you're seeing now?

Nathan


>
> On Tue, Aug 25, 2015 at 5:58 PM, Jared Coughlin <
> Jared.W.Coughlin.29 at nd.edu
> <javascript:_e(%7B%7D,'cvml','Jared.W.Coughlin.29 at nd.edu');>> wrote:
>
>> Thanks, I'll try that!
>> -Jared
>>
>> On Tue, Aug 25, 2015 at 5:55 PM, Andrew Myers <atmyers2 at gmail.com
>> <javascript:_e(%7B%7D,'cvml','atmyers2 at gmail.com');>> wrote:
>>
>>> Hi Jared,
>>>
>>> You probably don't want to loop over the entire array in pure python;
>>> that could be very slow for large datasets. One thing you can do is use
>>> slicing to select the elements of the array that meet your criterion:
>>>
>>> indices = data['gas','InternalEnergy'] <= 1e4
>>> data['gas', 'InternalEnergy'][indices] = *something*
>>>
>>> that would set all the elements where the InternalEnergy field is less
>>> than or equal to 1e4 to *something*. Usually you can express most
>>> operations you'd want to do this way without explicitly looping over the
>>> elements.
>>>
>>> -Andrew
>>>
>>> On Tue, Aug 25, 2015 at 2:44 PM, Jared Coughlin <
>>> Jared.W.Coughlin.29 at nd.edu
>>> <javascript:_e(%7B%7D,'cvml','Jared.W.Coughlin.29 at nd.edu');>> wrote:
>>>
>>>> That seemed to have worked, thanks!
>>>>
>>>> I just have another quick question, if you wouldn't mind? In my
>>>> function to generate my new field, there's an if statement that looks at
>>>> the value of the temperature: if data['gas','InternalEnergy'] <= 1e4:
>>>> However, I get the error: "The truth value of an array with more than
>>>> one element is ambiguous. Use a.any() or a.all()." I wasn't sure how to
>>>> loop over the elements of the array to access a specific element, or if
>>>> that's even possible? Using a.any() or a.all() don't seem to fit the bill
>>>> for this particular problem, either. Thanks!
>>>> -Jared
>>>>
>>>> On Tue, Aug 25, 2015 at 3:19 PM, Nathan Goldbaum <nathan12343 at gmail.com
>>>> <javascript:_e(%7B%7D,'cvml','nathan12343 at gmail.com');>> wrote:
>>>>
>>>>>
>>>>>
>>>>> On Tue, Aug 25, 2015 at 2:17 PM, Jared Coughlin <
>>>>> Jared.W.Coughlin.29 at nd.edu
>>>>> <javascript:_e(%7B%7D,'cvml','Jared.W.Coughlin.29 at nd.edu');>> wrote:
>>>>>
>>>>>> Great, thanks! I tried that, and it gave me the error: "YTQuantity
>>>>>> instances must be scalars." I'm not sure what to do about that, since all
>>>>>> of these quantities depend on either temperature or density, both of which
>>>>>> are arrays. I tried looking at the doc page for YTQuantity, but I didn't
>>>>>> see anything that looked like it could solve this problem, though it's
>>>>>> possible I missed it.
>>>>>>
>>>>>
>>>>> You need to use YTArray instead. YTQuantity is a subclass of YTArray
>>>>> that only holds scalars. YTArray can hold arrays of data with units.
>>>>>
>>>>>
>>>>>> -Jared
>>>>>>
>>>>>> On Mon, Aug 24, 2015 at 8:13 PM, Nathan Goldbaum <
>>>>>> nathan12343 at gmail.com
>>>>>> <javascript:_e(%7B%7D,'cvml','nathan12343 at gmail.com');>> wrote:
>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On Monday, August 24, 2015, Cameron Hummels <chummels at gmail.com
>>>>>>> <javascript:_e(%7B%7D,'cvml','chummels at gmail.com');>> wrote:
>>>>>>>
>>>>>>>> Hi Jared,
>>>>>>>>
>>>>>>>> The problem is one of units.  In order to make common arithmetic
>>>>>>>> work like addition, yt requires both arguments going into the addition
>>>>>>>> operator to have the same units.
>>>>>>>>
>>>>>>>> In your line,
>>>>>>>>
>>>>>>>> fHI = (recomb * ne) / (gamma_HI + (gamma_c *ne))
>>>>>>>>
>>>>>>>> you're adding two things (gamma_HI) and (gamma_c*ne) that have
>>>>>>>> different units--in this case, something with (code_mass/code_length**3)
>>>>>>>> units and something with no units defined as (1).
>>>>>>>>
>>>>>>>
>>>>>>> Just a quick clarification: they need not have the same units, just
>>>>>>> the same dimensions.  You can add two quantities with units of grams and
>>>>>>> solar masses (for example) but not grams and liters.
>>>>>>>
>>>>>>>
>>>>>>>>
>>>>>>>> In order to fix this, you can re-assign the appropriate units to
>>>>>>>> different arrays or quantities with the YTArray and YTQuantity classes.  In
>>>>>>>> this case, make sure that the two arguments going into the addition have
>>>>>>>> the same units.  If you want to recast "ne" to have number density units,
>>>>>>>> you can do this:  from yt.units.yt_array import YTQuantity; ne =
>>>>>>>> YTQuantity(ne, 'cm**-3').  For more info on units, check out
>>>>>>>> http://yt-project.org/docs/dev/analyzing/units/index.html
>>>>>>>>
>>>>>>>> I hope this helps!
>>>>>>>>
>>>>>>>> Cameron
>>>>>>>>
>>>>>>>> On Mon, Aug 24, 2015 at 4:12 PM, Jared Coughlin <
>>>>>>>> Jared.W.Coughlin.29 at nd.edu> wrote:
>>>>>>>>
>>>>>>>>> Hello! I have a gadget snapshot for which the standard internal
>>>>>>>>> energy block has been replaced by one containing the temperature.  I'm
>>>>>>>>> trying to calculate a derived field for the neutral hydrogen number
>>>>>>>>> density,  but I'm getting an error when I try to do ds.add_field():
>>>>>>>>>
>>>>>>>>> http://paste.yt-project.org/show/5833/
>>>>>>>>>
>>>>>>>>> However, I get an error about being unable to add quantities with
>>>>>>>>> differing units:
>>>>>>>>>
>>>>>>>>> http://paste.yt-project.org/show/5834/
>>>>>>>>>
>>>>>>>>> The docs say not to do any unit conversion because that is
>>>>>>>>> apparently taken care of behind the scenes, so I didn't.  I was just
>>>>>>>>> wondering if there was a way around this? Thanks!
>>>>>>>>> -Jared
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> _______________________________________________
>>>>>>>>> yt-users mailing list
>>>>>>>>> yt-users at lists.spacepope.org
>>>>>>>>> http://lists.spacepope.org/listinfo.cgi/yt-users-spacepope.org
>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> Cameron Hummels
>>>>>>>> NSF Postdoctoral Fellow
>>>>>>>> Department of Astronomy
>>>>>>>> California Institute of Technology
>>>>>>>> http://chummels.org
>>>>>>>>
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> yt-users mailing list
>>>>>>> yt-users at lists.spacepope.org
>>>>>>> <javascript:_e(%7B%7D,'cvml','yt-users at lists.spacepope.org');>
>>>>>>> http://lists.spacepope.org/listinfo.cgi/yt-users-spacepope.org
>>>>>>>
>>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> yt-users mailing list
>>>>>> yt-users at lists.spacepope.org
>>>>>> <javascript:_e(%7B%7D,'cvml','yt-users at lists.spacepope.org');>
>>>>>> http://lists.spacepope.org/listinfo.cgi/yt-users-spacepope.org
>>>>>>
>>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> yt-users mailing list
>>>>> yt-users at lists.spacepope.org
>>>>> <javascript:_e(%7B%7D,'cvml','yt-users at lists.spacepope.org');>
>>>>> http://lists.spacepope.org/listinfo.cgi/yt-users-spacepope.org
>>>>>
>>>>>
>>>>
>>>> _______________________________________________
>>>> yt-users mailing list
>>>> yt-users at lists.spacepope.org
>>>> <javascript:_e(%7B%7D,'cvml','yt-users at lists.spacepope.org');>
>>>> http://lists.spacepope.org/listinfo.cgi/yt-users-spacepope.org
>>>>
>>>>
>>>
>>> _______________________________________________
>>> yt-users mailing list
>>> yt-users at lists.spacepope.org
>>> <javascript:_e(%7B%7D,'cvml','yt-users at lists.spacepope.org');>
>>> http://lists.spacepope.org/listinfo.cgi/yt-users-spacepope.org
>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.spacepope.org/pipermail/yt-users-spacepope.org/attachments/20150825/ff6f8a49/attachment.html>


More information about the yt-users mailing list