嗨,我有一个问题,我不知道如何在python中实现。我有三个不同的数组。我有X的值和Y的值,使得每个X都属于一个特定的Y (X,Y)。现在,我从它建立了一个直方图。
U, V = histogram(X, bins=arange(min(X), max(X), 50))第三个数组(V)具有每个桶的点数。知道了这一点,我想打印不同的Y值为每个点在不同的回收箱。它是:
for i, j in zip(X, Y):
if a<i<b:
print j其中a是V中的第一个值,b是第二个值。例如,在我的第一个例子中,第一个值是500,第二个值是600,所以它是:
for i, j in zip(X, Y):
if 500<i<600:
print j在这里,它打印位于X的范围在500-600之间的点的Y值。现在我要做的是实现一个循环,这样我就不必手动为V编写不同的条目了,我在想:
for i, j, k in zip(X,Y,range(len(V))):
if V[k]<i<V[k+1]:
print j 但不起作用。有什么想法吗?
发布于 2015-02-12 17:02:55
从你问题中的代码看,你似乎在使用numpy。在numpy中有更好的方法来处理这个问题,我将在答案的最后再讨论这些问题。不过,就目前而言,让我们看看为什么你的尝试不起作用。
它不能工作的原因是您的V数组是bin边。它与X或Y数组的大小不同。
当您将zip序列放在一起时,zip会在最短序列被迭代时停止。例如:
for i, j in zip([1, 2], [5, 6, 7, 8, 9]):
print j将产生:
5
6在您的例子中,您实际上希望在回收站上迭代,然后在X和Y上有一个内环。例如:
for k in range(len(V)):
for i, j in zip(x, y):
if V[k]<i<V[k+1]:
print j 我们还可以通过这样的操作来使其更加可读性:
bin_edges = V
for left, right in zip(bin_edges, bin_edges[1:]):
for i, j in zip(x, y):
if left < i < right:
print j然而,这两种方法都是低效的。(遍历numpy数组比遍历列表要慢,但即使使用列表,这也会很慢。)
幸运的是,您使用的是numpy,而且还有更有效的方法。
首先,让我们重现上面的示例,但是让我们使用布尔索引来删除内环:
import numpy as np
# Generate some random data
x, y = np.random.random((2, 100))
# Your "U" and "V" arrays, but I'm changing the names for clarity
counts, bins = np.histogram(x, bins=20)
# Rather than iterate over an index, let's use a slightly different trick
for left, right in zip(bins[:-1], bins[1:]):
# Use boolean indexing to replace the inner loop
print y[(x > left) & (x < right)]另一种方法是通过numpy.digitize
import numpy as np
# Generate some x, y data
x, y = np.random(2, 100)
# Create a histogram of x
counts, bins = np.histogram(x, bins=30)
# Return an series of indicies of which bin each x-value falls into
# This will be the same size as x and have values between 0 to len(bins)
idx = np.digitize(x, bins)
# Print the y-values for each bin
for i in range(bins.size):
y[idx == i]无论哪种方法,对此使用布尔索引而不是内部循环都会产生显着的加速。
发布于 2015-02-12 15:52:03
你犯了什么错误?您可能是在数组之外建立索引
for i, j, k in zip(X,Y,range(len(V))):
if V[k]<i<V[k+1]:
print j 当k是len(V)时,就没有V[k+1]了。你可以做这样的事
for i, j, k in zip(X,Y,range(len(V)-1)):
if V[k]<i<V[k+1]:
print j
#handle the last bin separately
if X[-1] > V[-1]:
print Y[-1]https://stackoverflow.com/questions/28480407
复制相似问题