【问题标题】:Whats the best way to iterate over multidimensional array and tracking/doing operations on iteration index什么是迭代多维数组和跟踪/执行迭代索引操作的最佳方法
【发布时间】:2016-07-10 00:26:26
【问题描述】:

我需要对多维 numpy 数组进行大量操作,因此我正在尝试最好的方法。

假设我有一个这样的数组:

A = np.random.uniform(0, 1, size = 100).reshape(20, 5)

我的目标是获取每个条目的最大值numpy.amax() 及其索引。所以A[0] 可能是这样的:

A[0] = [ 0.64570441 0.31781716 0.07268926 0.84183753 0.72194227]

我想获得最大值和该最大值的索引[0.84183753][0, 3]。不需要对结果的具体表示,只是一个例子。我什至只需要水平索引。

我尝试使用 numpy 的 nditer 对象:

A_it = np.nditer(A, flags=['multi_index'], op_flags=['readwrite'])

while not A_it.finished:
    print(np.amax(A_it.value))
    print(A_it.multi_index[1])
    A_it.iternext()

我可以通过这种方式在迭代中访问数组的每个元素及其索引,但我似乎无法将numpy.amax() 函数带入每个元素中,并将索引语法明智地结合在一起。我什至可以使用nditerobject 来做到这一点吗?

另外,在Numpy: Beginner nditer 中,我读到使用nditer 或在numpy 中使用迭代通常意味着我做错了什么。但是我找不到另一种方便的方法来在这里实现我的目标而无需任何迭代。显然我是 numpy 和 python 的初学者,所以非常感谢任何要搜索或提示的关键字。

【问题讨论】:

  • A.argmax(axis=1) ?
  • 不要使用nditer。使用常规 python for 循环。

标签: python arrays numpy multidimensional-array


【解决方案1】:

nditer 的一个主要问题是它遍历每个元素,而不是每一行。最好将其用作 Cython 或 C 代码重写的垫脚石。

如果您只想要数组中每一行的最大值,那么简单的迭代或列表推导就可以了。

for row in A: print(np.amax(row))

或将其转回数组:

np.array([np.amax(row) for row in A])

但是你可以通过给amax一个轴参数来获得相同的值

np.amax(A,axis=1)

np.argmax标识最大值的位置。

np.argmax(A,axis=1)

使用 argmax 值,您也可以选择最大值,

ind=np.argmax(A,axis=1)
A[np.arange(A.shape[0]),ind]

(速度与重复np.amax 调用大致相同)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-16
    • 2021-10-18
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    • 2017-03-28
    相关资源
    最近更新 更多