【问题标题】:Is it possible to vectorize this Python code containing 1D and 2D numpy arrays?是否可以对包含 1D 和 2D numpy 数组的 Python 代码进行矢量化?
【发布时间】:2014-11-28 16:45:10
【问题描述】:

actualrgn 是 3145728 个元素的一维 numpy.ndarrayactualrgnexpand 是 2D numpy.ndarray,尺寸为 12 x 3145728。

for j in range(len(actualrgn)):
    for i in reversed(range(12)):
        if actualrgn[j] >= 2**i:
            actualrgnexpand[i][j] = 1
            actualrgn[j] -= 2**i

是否可以对上述内容进行矢量化,以便我失去actualrgn 元素的外循环?我尝试使用numpy.vectorize,但似乎很难将标量和向量的函数(使用数学等价物)转换为向量和矩阵的函数。我还尝试找到“内置”ufunc 来简化上述内容,但没有成功。

【问题讨论】:

  • 如果您使用的是 Python 2.x,我建议为大数组调用 xrange 而不是 range。您节省了大量的空间和时间。

标签: python arrays numpy vectorization


【解决方案1】:

向量化“if”语句的常用方法是使用布尔索引掩码。

for i in reversed(range(12)):
    I = actualrgn >= 2**i
    actualrgnexpand[i,I] = 1
    actualrgn[I] -= 2**i

actualrgn[I] 是应该修改的数字子集。这些分配的右侧必须是正确的大小。在这种情况下,标量适合所有情况。

【讨论】:

  • 我认为你打错了range(range(12)) 而不仅仅是range(12)
  • 是 - 不完整的编辑,从从数组大小推断出范围的版本开始。
  • @hpaulj 如何扩展布尔表达式以便检查 2 个条件? IE。 I = actualrgn >= a1 && actualrgn < a2 之类的东西,但不是那样,因为我已经尝试过了,但它没有用......
  • 试试I = (actualrgn>=a1)&(acutalrgn<a2)。目标是在两个布尔数组上使用元素明智的.__and__() 操作。 I 最终应该是一个与actualrgn 具有相同形状的布尔数组。 np.logical_and 也这样做。
猜你喜欢
  • 1970-01-01
  • 2013-04-15
  • 2021-09-19
  • 1970-01-01
  • 2020-11-26
  • 2021-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多