我是Python和Numpy的新手,我花了很多时间(几天)寻找我的问题的答案,但我很难过。我有一系列地震的震级,我需要将它们转换为不同的震级(Mb到Mo)。对于小于4.3的幅度,我需要应用一次转换,对于大于或等于的幅度,我需要应用第二次转换。我需要输出与输入的顺序相同,这就是我撞墙的地方。我可以将转换输出到两个单独的数组,但我无法弄清楚如何编写一个程序,根据幅度选择一个方程,应用它并继续到数组中的下一个数量级。尽管以下示例在许多级别上显然都是错误的,但我认为它显示了我正在尝试实现的目标:
data = numpy.genfromtxt('OK_mag3.csv')
mag = numpy.asarray(data)
for x in mag:
if x < 4.3:
mw = 1.03 + 0.67 * x
else:
mw = 0.1 + 0.88 * x
此外,获得一半正确的例子是:
mw = mag[mag<4.3]*0.67+1.03
但后来我不知道如何纳入第二个等式。
非常感谢任何帮助!
答案 0 :(得分:3)
mw = numpy.where(mag < 4.3, 1.03 + 0.67 * mag, 0.1 + 0.88 * mag)
请参阅numpy.where
上的文档。第一个参数将data
转换为布尔列表,后两个参数将使用一个函数或另一个函数计算整个向量;然后where
根据布尔值选择两个结果中哪一个更好。
编辑:基于注释中提出的问题,以下内容不会使工作量增加一倍,并且可以避免其中一个计算无效的情况 - 但仍会占用选择器数组的一些内存。
mw = numpy.zeros(len(mag))
select = mag < 4.3
mw[select] = 1.03 + 0.67 * mag[select]
select = ~select
mw[select] = 0.1 + 0.88 * mag[select]
答案 1 :(得分:0)
您可以使用np.where
:
In [1]: import numpy as np
In [2]: arr = np.eye(3)
In [3]: arr
Out[3]:
array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])
In [4]: arr[np.where(arr==0)] += 2
In [5]: arr
Out[5]:
array([[ 1., 2., 2.],
[ 2., 1., 2.],
[ 2., 2., 1.]])
在您的情况下,对于每种情况,您可以执行以下操作:
mw[np.where(mw < 4.3)] = mw[np.where(mw < 4.3)]*0.67 + 1.03