将二维数组中的任意行的值赋给nans

时间:2016-12-11 20:34:25

标签: python arrays numpy

我有一个2D numpy数组z,其中我想基于行的等式+/-宽度为20将值赋给nan。我正在尝试实现拉曼第二次散射校正,因为它是由此处列出的eemR包中的eem_remove_scattering方法完成: https://cran.r-project.org/web/packages/eemR/vignettes/introduction.html 但该方法不可见。

   import numpy as np
   ex = np.array([240, 245, 250, 255, 260, 265, 270, 275, 280, 285, 290, 295, 300,
        305, 310, 315, 320, 325, 330, 335, 340, 345, 350, 355, 360, 365,
        370, 375, 380, 385, 390, 395, 400, 405, 410, 415, 420, 425, 430,
        435, 440, 445, 450])
   em = np.array([300, 302, 304, 306, 308, 310, 312, 314, 316, 318, 320, 322, 324,
        326, 328, 330, 332, 334, 336, 338, 340, 342, 344, 346, 348, 350,
        352, 354, 356, 358, 360, 362, 364, 366, 368, 370, 372, 374, 376,
        378, 380, 382, 384, 386, 388, 390, 392, 394, 396, 398, 400, 402,
        404, 406, 408, 410, 412, 414, 416, 418, 420, 422, 424, 426, 428,
        430, 432, 434, 436, 438, 440, 442, 444, 446, 448, 450, 452, 454,
        456, 458, 460, 462, 464, 466, 468, 470, 472, 474, 476, 478, 480,
        482, 484, 486, 488, 490, 492, 494, 496, 498, 500, 502, 504, 506,
        508, 510, 512, 514, 516, 518, 520, 522, 524, 526, 528, 530, 532,
        534, 536, 538, 540, 542, 544, 546, 548, 550, 552, 554, 556, 558,
        560, 562, 564, 566, 568, 570, 572, 574, 576, 578, 580, 582, 584,
        586, 588, 590, 592, 594, 596, 598, 600])
    X, Y = np.meshgrid(ex, em)
    z = np.sin(X) + np.cos(Y)

我想要应用的等式是em = - 2 ex /(0.00036 * ex-1)+ 500。 我想将数组中与此行相交的每个值(+/- 20)设置为nans。它足够简单,可以将单个元素设置为nans,但是我无法找到一个python函数将此方程应用于数组,只将与此行相交的值设置为nans。 期望的输出将是具有与z相同尺寸的新阵列,但是具有与等于nan的线相交的值。任何关于如何进行的建议都非常感谢。

1 个答案:

答案 0 :(得分:1)

使用np.where形式的np.where( "condition for intersection", np.nan, z)

zi = np.where( np.abs(-2*X/(0.00036*X-1) + 500 - Y) <= 20, np.nan, z)

事实上,这里没有交叉点,因为(0.00036 * ex-1)对于所有值都接近-1,这使得- 2*ex/(0.00036*ex-1)接近2*ex,并且增加了500通过em中的任何值来实现这一点。但原则上这是有效的。

此外,我怀疑通过使用masked array可以更好地实现您计划通过将这些值设置为NaN来实现的目标。