【问题标题】:Multidimensional indexing and mapping多维索引和映射
【发布时间】:2014-09-15 04:47:50
【问题描述】:

我看到numpy 有许多索引工具,但仍然无法让它们完成我需要的工作。

首先,假设有两个形状相同的一维数组A, I,一个可以用I的元素索引的一维数组B,以及一个三参数函数f。然后我需要的结果可以像starmap(f, zip(A, I, B[I])) 一样实现(starmapzip 来自纯python,而不是numpy)。到目前为止,一切都很好......

但实际上,所有数组都是二维,我也想得到二维结果,这相当于将与上面相同的函数应用于数组的每一行 -这就是我现在循环执行的操作。

除了循环之外,还有更好的方法吗?

UPD:

例如,一维数组:

A = np.random.randint(0, 10, size=(3,))
B = np.random.randint(0, 10, size=(5,))
I = np.random.randint(0, 5, size=(3,))

def f(a, i, b):
    return (a, i, b)

print A, I, B
print list(starmap(f, zip(A, I, B[I])))

对于二维:

A = np.random.randint(0, 10, size=(2, 3))
B = np.random.randint(0, 10, size=(2, 5))
I = np.random.randint(0, 5, size=(2, 3))

def f(a, i, b):
    return (a, i, b)

print A
print I
print B
print [list(starmap(f, zip(A_row, I_row, B_row[I_row])))
       for A_row, I_row, B_row in zip(A, I, B)]

【问题讨论】:

  • 写。 “拳头假设有……”你为什么不给我们一些代码?显示,不要告诉。
  • @Jaime:f 只是一个库中的纯 python 函数,我无法更改。

标签: python arrays numpy multidimensional-array


【解决方案1】:

如果它只是一个普通函数,那么您的开销将主要是函数开销。您可以使用hstack 或其他方式执行zip,但这对速度没有帮助。

如果您只是在寻找一种更简洁的方法,请尝试

x_indexes, _ = numpy.ogrid[:len(I), :0]
numpy.vectorize(f)(A, I, B[x_indexes, I])

通常,更高级别的视图可以让您矢量化整个事物,这会更快。如果结果很慢,请记住这一点。

【讨论】:

  • 实际上,在这种情况下,我不太关心速度,因为结果只会打印给用户 - 所以它不应该很大。但是,像您在这篇文章中建议的那样,更简洁的方法可以在多个方面使代码变得更好。而且,顺便说一句,您的代码不适用于任何情况,无论是单维还是二维。
  • 它现在应该可以工作了。不幸的是,它不那么漂亮了。
  • 此版本不会在二维情况下引发异常,但输出与所需的不同(它在整个数组上执行f,而不是按元素执行)。与有问题的代码进行比较。
  • 这取决于f是否返回一个元组。如果是这样,则返回几个数组(因为numpy 不能存储元组)所以你可能想要dstack 他们。如果f 只返回一个数字,则结果更相似。
  • 哦,真的 - 现在检查数字。但是,在我的情况下,f 返回一个 python 对象,看来我应该继续使用循环......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-29
  • 1970-01-01
  • 2015-05-06
  • 2023-03-27
  • 2021-03-23
  • 1970-01-01
  • 2021-07-27
相关资源
最近更新 更多