将输入标记分配给python中的函数输出

时间:2013-12-18 00:25:10

标签: python numpy

对于看似基本的问题感到抱歉。我试图实现的内容总结如下:

  1. 生成输入变量:x,y。
  2. 设z = F(x,y)。
  3. 绘制z代表x和y的特定组合。
  4. 例如:

    zlist = []
    for _ in range(100):
        x = np.random.random()*1.
        y = np.random.random()*.5
        if x < .5:
            z = y / 2
        else:
            z = y * 2
        zlist.append(z)
    

    现在,如果我想为(0,0.3)之间的所有x绘制z,我可能需要在zlist中的每个元素上使用一些标记来指示其输入变量。我如何附加这样的标记,然后在绘图时从列表中访问它?

2 个答案:

答案 0 :(得分:1)

我实际上对Numpy一无所知,所以有人请评论并告诉我,如果我自己傻瓜。不过,它看起来像是香草蟒蛇的行为。

不是追加z,而是追加(z,x)。现在zlist是一个元组列表,你可以通过检查zlist [i] [1]来遍历和绘制。

zlist = []
for _ in range(100):
    x = np.random.random()*1.
    y = np.random.random()*.5
    if x < .5:
        z = y / 2
    else:
        z = y * 2
    zlist.append((z,x))

for value in zlist:
    if value[1] > 0 and value[1] < 0.3:
        # Plot value[0]
# Or if you prefer list comprehensions:
# [value[0] for value in zlist if value[1] >0 and value[1] < 0.3]
# that will return a list with only the z values in zlist.

答案 1 :(得分:1)

使用numpy,对矢量执行操作几乎总是更有效率 数组而不是内置的Python序列类型,如列表。这是一个 你可以快速找到两组随机x的每个组合的 F(x,y) 和Python中没有循环的y值。结果将是一个nx-by-ny 数组Z,其中Z[i, j] = F(x[i], y[j])

首先,您可以将所有x,y输入生成为向量:

nx = 100
ny = 200
x = np.random.random(size=nx) * 1.
y = np.random.random(size=ny) * 5.

为了使结果成为nx-by-ny数组,你可以采用这两个向量和 将它们乘以1得到两个包含x和y的2D nx-by-ny数组 分别表示行和列中的值。你可以利用numpy来做到这一点 broadcasting rules

x_arr = x[:,np.newaxis] * np.ones((nx,ny))
y_arr = y[np.newaxis,:] * np.ones((nx,ny))

您将应用于每个x,y对的函数取决于x值。 幸运的是,您可以使用np.where(<condition>, <do_this>, <do_that>)申请 根据某些条件对输入值的不同操作:

Z = np.where(x_arr < 0.5, y_arr / 2., y_arr * 2.)

我们可以检查所有结果是否正确:

for i in xrange(nx):
    for j in xrange(ny):
        if x[i] < 0.5:
            assert Z[i, j] == y[j] / 2.
        else:
            assert Z[i, j] == y[j] * 2

实际上,在不将Zx扩展为2D数组的情况下,计算y的方法更加清晰。使用我们曾经获得的相同广播技巧 x_arry_arr,您可以将xy直接传递给np.where()

x2 = x[:,np.newaxis]
y2 = y[np.newaxis,:]

Z2 = np.where(x2 < 0.5, y2 / 2., y2 * 2.)

assert np.all(Z == Z2)