【问题标题】:NumPy: How to collapse N-dimensional array along a single dimension using argmin/max output?NumPy:如何使用 argmin/max 输出沿单个维度折叠 N 维数组?
【发布时间】:2013-04-13 01:06:07
【问题描述】:

是否有一种直接的方法可以使用在 N 维数组的单个维度上调用 NumPy 的 argmaxargmin 函数的输出来定义该数组的索引?

这可能最好用一个例子来解释。考虑以下示例 随时间变化的二维温度读数网格:

>>> import numpy as np
>>> times = np.array([0, 20])
>>> temperature_map_t0 = np.array([[10, 12, 14], [23, 40, 50]])
>>> temperature_map_t1 = np.array([[20, 12, 15], [23, 10, 12]])
>>> temperature_map = np.dstack([temperature_map_t0, temperature_map_t1])

和包含相应压力读数的形状相同的 N-D 阵列:

>>> pressure_map = np.random.rand(*temperature_map.shape)

我们可以找到每个位置的最高温度:

>>> top_temperatures = temperature_map.max(axis=2)
>>> top_temperatures
array([[20, 12, 15],
       [23, 40, 50]])

以及它们发生的时间:

>>> times = times[temperature_map.argmax(axis=2)]
>>> times
array([[20,  0, 20],
       [ 0,  0,  0]])

但是我们如何使用temperature_map.argmax(axis=2)来找到对应的 压力?

>>> pressures_at_top_temperatures = pressures[ ???? ]

换句话说 - 折叠单个维度的索引语法是什么 使用该维度的 argminargmax 索引的 N 维数组?

【问题讨论】:

标签: python multidimensional-array matrix numpy slice


【解决方案1】:

感谢Jaime 当我有similar problem 时回答的问题

import numpy as np
times = np.array([0, 20])
temperature_map_t0 = np.array([[10, 12, 14], [23, 40, 50]])
temperature_map_t1 = np.array([[20, 12, 15], [23, 10, 12]])
temperature_map = np.dstack([temperature_map_t0, temperature_map_t1])
top_temperatures = temperature_map.max(axis=2)

# shape is a tuple - no need to convert
# http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.shape.html
pressure_map = np.random.rand(*temperature_map.shape)

idx = temperature_map.argmax(axis=2)

s = temperature_map.shape
result pressure_map[np.arange(s[0])[:, None], np.arange(s[1]), idx]

【讨论】:

  • @Mr.E -- 有一个非常相似的问题的答案,我认为它稍微好一点:stackoverflow.com/questions/15469302/…
  • @mgilson,是的,这很好。我以前没有遇到过 ndenumerate 。谢谢 - 你应该发布一个答案(或投票结束?)
  • 我实际上指的是使用ogrid的答案
【解决方案2】:

我能想到的最直接的解决方案是使用逻辑索引将未由所需索引选择的条目归零,然后对感兴趣的维度求和,例如如下:

def collapse_dimension(ndarr, index, axis):
    r = np.rollaxis(ndarr, axis, 0)
    return np.sum((r[i] * (index == i) for i in range(r.shape[0])), axis=0)

所以对于上面的例子,我们可以使用argmaxargmin 来折叠任意给定维度的数组,例如

>>> pressures_at_top_temperatures = collapse_dimension(
...     pressure_map, temperature_map.argmax(axis=2), 2)

并且,很简单,使用相应的argmax 在任何给定维度上获取max

>>> temperature_map.max(axis=2) == collapse_dimension(
...     temperature_map, temperature_map.argmax(axis=2), 2)
array([[ True,  True,  True],
       [ True,  True,  True]], dtype=bool)

但是,我强烈怀疑有一种更好的方法可以做到这一点,而无需编写这个额外的函数——有什么想法吗??

【讨论】:

    猜你喜欢
    • 2020-09-06
    • 2015-08-27
    • 2017-06-07
    • 2013-10-17
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 2020-02-09
    • 2015-02-01
    相关资源
    最近更新 更多