将两个方程应用于一个数组

时间:2014-07-10 01:05:47

标签: python arrays numpy

我是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

但后来我不知道如何纳入第二个等式。

非常感谢任何帮助!

2 个答案:

答案 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