【问题标题】:What are the efficient ways to assign values to 2D numpy arrays as functions of indicies将值分配给 2D numpy 数组作为索引函数的有效方法是什么
【发布时间】:2019-06-05 13:05:32
【问题描述】:

这可能是一个愚蠢的问题,但我找不到类似的问题(目前)。 例如,我定义为函数 f(x,y)

def f(x, y):
    return x+y

现在我想输出一个 2D numpy 数组,一个元素的值等于它的索引总和,例如,如果我想要一个 2x2 数组:

arr = [[0, 1],
       [1, 2]]

如果我想要一个 3x3 数组,那么输出应该是:

arr = [[0, 1, 2], 
       [1, 2, 3],
       [2, 3, 4]]

逐个赋值效率不高,尤其是数组大小很大的时候,比如10000*10000,这也是对numpy速度快的浪费。虽然这听起来很基本,但我想不出一个简单快捷的解决方案。最常见和最有效的方法是什么?

顺便说一下,求和指数只是一个例子。我希望该方法也可以推广到任意函数,例如,

def f(x,y):
    return np.cos(x)+np.sin(y)

甚至是更高维的数组,例如 4x4 数组。

【问题讨论】:

  • 只给定一个函数(有两个参数,比如f(x, y)),我想输出一个二维数组,其中数组的每个元素都等于f(i, j),其中i , j 是数组中元素的索引。
  • @erip 我相信arr = [[0, 1], [1, 2]] any 2x2 数组的输出。添加任何 2x2 数组的每个元素的行索引和列索引(从 0 开始)和...
  • @TrebledJ 没错。 arr 是输出。 0 来自指数 (0,0),将它们相加得出 0。2 来自指数 (1,1),将它们相加得出 2。

标签: python arrays function numpy


【解决方案1】:

您可以使用numpy.indices,它返回一个表示网格索引的数组;您只需要沿 0 轴求和即可:

>>> a = np.random.random((2,2))
>>> np.indices(a.shape).sum(axis=0) # array([[0, 1], [1, 2]])
>>> a = np.random.random((3,3))
>>> np.indices((3,3)).sum(axis=0) #array([[0, 1, 2], [1, 2, 3], [2, 3, 4]])

【讨论】:

  • 谢谢。但是如何将方法推广到任意定义的f(x,y)
  • 只是出于好奇:x,y = (10000, 10000) 很有可能,根据机器,他会得到一个MemoryError,对吧?
  • 如果您希望利用 numpy 矢量化,则没有通用答案。您可以直接使用来自numpy 的调用,而不是nd-arrays 的方法;例如,np.sum(np.indices((3,3)), axis=0)np.sum(np.cos(np.indices((3,3))), axis=0)
  • 所以如果函数非常通用,或者甚至可能没有封闭形式,我希望使用之前定义的一些函数,我能做的最好的事情就是一一赋值使用 for 循环?
  • 如果 f(x,y) 仅适用于标量 x,y 值,则没有快速替代 python 迭代的方法。您必须为每个 x,y 对调用一次。但是,您的示例使用已编译的 numpy 运算符处理数组值。如果你想快速numpy 使用它提供的构建块,
猜你喜欢
  • 2019-01-04
  • 1970-01-01
  • 2018-01-24
  • 1970-01-01
  • 1970-01-01
  • 2013-08-28
  • 2015-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多