我想通过指定行和列的函数来创建一个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循环。
有什么建议吗?
答案 0 :(得分:1)
您可以尝试使用index arrays。
对于您的简单示例,使用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.]])
答案 1 :(得分:0)
您的特定示例的最快解决方案是np.arange(6).reshape(3, 2)
。通常,您可以将np.vectorize
用于1D数组,然后在必要时重新整形,但这不是优化的(“实现本质上是for循环。”)。