繁体   English   中英

如何使用每行和每列调用的函数有效地填充numpy ndarray?

[英]How do I efficiently fill a numpy ndarray with a function called at each row and column?

我想通过指定行和列的函数来定义值来创建numpy ndarray。

例如,我希望能够做这样的事情(完全不正确的语法,但你应该得到这个想法):

>>> np.ndarray((2,3), lambda r,c: 3*r+c)
[[ 0  1  2]
 [ 3  4  5]]

在线搜索没有任何结果,但我很难想到如何搜索它......

现在我已经得到了(相当于)以下代码,但它的效率非常低:

def ndarrayFuncFill(size, func):
    z = np.empty(size)
    for r in np.arange(size[0]):
        for c in np.arange(size[1]):
            z[r][c] = func(r,c)
    return z

>>> ndarrayFuncFill((2,3), lambda r,c: 3*r+c)
array([[ 0.,  1.,  2.],
       [ 3.,  4.,  5.]])

不幸的是,我现在特别想要使用它的功能不是我可以轻易地重写为ufunc或类似的东西。 我几乎不得不把它当作一个黑盒子。

我真正感兴趣的功能(不是像上面的lambda那么简单),不是我有权发布的。 但是,它基本上在查找表上进行插值。 所以你给它一个行和列,然后它将它转换为查找表中的索引 - 但是有一些棘手的事情发生在它不仅仅是一对一的查找,它有时会组合'附近'价值观,那种东西。 所以它也不是最有效的功能,但我宁愿没有太多其他愚蠢的浪费来源,比如嵌套的for循环。

有什么建议么?

您可以尝试使用索引数组 对于您的简单示例,使用np.indices可以执行以下操作:

import numpy as np
r, c = 2, 3
a = np.empty((r, c))
b = np.indices((r, c))
a[b[0], b[1]] = 3 * b[0] + b[1]

那么我们有:

>>> a
array([[ 0.,  1.,  2.],
       [ 3.,  4.,  5.]])

对于您的特定示例,最快的解决方案是np.arange(6).reshape(3, 2) 通常,您可以将np.vectorize用于1D数组,然后在必要时重新np.vectorize ,但这不是优化的(“实现本质上是for循环。”)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM