我有一个 2D numpy 数组 z,其中我想根据线 +/- 宽度 20 的方程为 nan 分配值。我正在尝试实现拉曼第二散射校正,因为它是通过此处列出的 eemR 包中的 eem_remove_scattering 方法完成: 奥 git _a 但该方法不可见。
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 的线相交。非常感谢任何有关如何继续的建议。
最佳答案
以 np.where( "condition for junction", np.nan, z)
的形式使用 np.where
:
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 来实现的目标。 .
关于python - 将二维数组中任意行的值赋给 nans,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41090854/