首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环数组

循环数组
EN

Stack Overflow用户
提问于 2015-02-12 14:45:16
回答 2查看 106关注 0票数 1

嗨,我有一个问题,我不知道如何在python中实现。我有三个不同的数组。我有X的值和Y的值,使得每个X都属于一个特定的Y (X,Y)。现在,我从它建立了一个直方图。

代码语言:javascript
复制
U, V = histogram(X, bins=arange(min(X), max(X), 50))

第三个数组(V)具有每个桶的点数。知道了这一点,我想打印不同的Y值为每个点在不同的回收箱。它是:

代码语言:javascript
复制
for i, j in zip(X, Y):
     if a<i<b:
         print j

其中a是V中的第一个值,b是第二个值。例如,在我的第一个例子中,第一个值是500,第二个值是600,所以它是:

代码语言:javascript
复制
for i, j in zip(X, Y):
     if 500<i<600:
         print j

在这里,它打印位于X的范围在500-600之间的点的Y值。现在我要做的是实现一个循环,这样我就不必手动为V编写不同的条目了,我在想:

代码语言:javascript
复制
for i, j, k in zip(X,Y,range(len(V))):
     if V[k]<i<V[k+1]:
         print j 

但不起作用。有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-12 17:02:55

从你问题中的代码看,你似乎在使用numpy。在numpy中有更好的方法来处理这个问题,我将在答案的最后再讨论这些问题。不过,就目前而言,让我们看看为什么你的尝试不起作用。

它不能工作的原因是您的V数组是bin边。它与XY数组的大小不同。

当您将zip序列放在一起时,zip会在最短序列被迭代时停止。例如:

代码语言:javascript
复制
for i, j in zip([1, 2], [5, 6, 7, 8, 9]):
    print j

将产生:

代码语言:javascript
复制
5
6

在您的例子中,您实际上希望在回收站上迭代,然后在XY上有一个内环。例如:

代码语言:javascript
复制
for k in range(len(V)):
     for i, j in zip(x, y):
         if V[k]<i<V[k+1]:
             print j 

我们还可以通过这样的操作来使其更加可读性:

代码语言:javascript
复制
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,而且还有更有效的方法。

首先,让我们重现上面的示例,但是让我们使用布尔索引来删除内环:

代码语言:javascript
复制
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

代码语言:javascript
复制
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]

无论哪种方法,对此使用布尔索引而不是内部循环都会产生显着的加速。

票数 1
EN

Stack Overflow用户

发布于 2015-02-12 15:52:03

你犯了什么错误?您可能是在数组之外建立索引

代码语言:javascript
复制
for i, j, k in zip(X,Y,range(len(V))):
     if V[k]<i<V[k+1]:
         print j 

klen(V)时,就没有V[k+1]了。你可以做这样的事

代码语言:javascript
复制
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]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28480407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档