1

我在理解 Numpy 数组中的索引时遇到了一个小问题。我认为一个简化的例子是最好的了解我正在尝试做的事情。所以首先我创建一个我想要填充的大小的零数组:

x = range(0,10,2)
y = range(0,10,2)
a = zeros(len(x),len(y))

所以这会给我一个 5X5 的零数组。现在,我想用一个我无法使用网格的相当复杂的函数来填充数组。我的问题是我想迭代为:

for i in xrange(0,10,2):
    for j in xrange(0,10,2):
          .........
    "do function and fill the array corresponding to (i,j)"

但是,现在我想成为 a[2,10] 的是 2 和 10 的函数,但是 2 和 10 的函数的索引将是 a[1,4] 或其他。

再说一次,也许这是基本的,我浏览了文档,发现自己不知所措。

编辑:最后我尽可能地矢量化并编写了我在 Cython 中无法实现的模拟循环。此外,我使用 Joblib 来并行化操作。我将结果存储在一个列表中,因为在并行运行时数组没有正确填充。然后,我使用 Itertools 将列表拆分为单独的结果,并使用 Pandas 来组织结果。谢谢大家的帮助

4

2 回答 2

2

一些技巧可以帮助您完成工作并保持良好的性能:

- avoid Python `for` loops
- create a function that can deal with vectorized inputs

例子:

def f(xs, ys)
    return x**2 + y**2 + x*y

您可以在其中传递xsys作为数组,并且操作将按元素完成:

xs = np.random.random((100,200))
ys = np.random.random((100,200))

f(xs,ys) 

您应该阅读有关numpy广播的更多信息,以更好地了解数组的操作是如何工作的。这将帮助您设计一个可以正确处理数组的函数。

于 2013-08-08T22:02:44.503 回答
0

首先,你缺少一些带零的括号,第一个参数应该是一个元组:

a = zeros((len(x),len(y)))

然后,您的表的相应索引是 i/2 和 j/2 :

for i in xrange(0,10,2):
    for j in xrange(0,10,2):
        # do function and fill the array corresponding to (i,j)
        a[i/2, j/2] = 1

但我支持 Saullo Castro,你应该尝试向量化你的计算。

于 2013-08-20T12:06:46.347 回答