对于看似基本的问题感到抱歉。我试图实现的内容总结如下:
例如:
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中的每个元素上使用一些标记来指示其输入变量。我如何附加这样的标记,然后在绘图时从列表中访问它?
答案 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
实际上,在不将Z
和x
扩展为2D数组的情况下,计算y
的方法更加清晰。使用我们曾经获得的相同广播技巧
x_arr
和y_arr
,您可以将x
和y
直接传递给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)