当前位置: 首页 > 面试题库 >

irascibility:argmax多轴无循环

魏威
2023-03-14
问题内容

我有一个N维数组(名为A)。对于A的第一轴的每一行,我想获得沿A的其他轴的最大值的坐标。然后,我将返回一个二维数组,其中包含第一轴的每一行的最大值的坐标的A。

我已经使用循环解决了问题,但是我想知道是否有更有效的方法可以做到这一点。我当前的解决方案(对于示例数组A)如下:

import numpy as np

A=np.reshape(np.concatenate((np.arange(0,12),np.arange(0,-4,-1))),(4,2,2))
maxpos=np.empty(shape=(4,2))
for n in range(0, 4):
    maxpos[n,:]=np.unravel_index(np.argmax(A[n,:,:]), A[n,:,:].shape)

在这里,我们将有:

A: 
[[[ 0  1]
  [ 2  3]]

 [[ 4  5]
  [ 6  7]]

 [[ 8  9]
  [10 11]]

 [[ 0 -1]
  [-2 -3]]]

maxpos:
[[ 1.  1.]
 [ 1.  1.]
 [ 1.  1.]
 [ 0.  0.]]

如果有多个最大化器,我不介意选择哪个。

我尝试使用np.apply_over_axes,但是我没有设法使它返回想要的结果。


问题答案:

你可以做这样的事情-

# Reshape input array to a 2D array with rows being kept as with original array.
# Then, get idnices of max values along the columns.
max_idx = A.reshape(A.shape[0],-1).argmax(1)

# Get unravel indices corresponding to original shape of A
maxpos_vect = np.column_stack(np.unravel_index(max_idx, A[0,:,:].shape))

样品运行

In [214]: # Input array
     ...: A = np.random.rand(5,4,3,7,8)

In [215]: # Setup output array and use original loopy code
     ...: maxpos=np.empty(shape=(5,4)) # 4 because ndims in A is 5
     ...: for n in range(0, 5):
     ...:     maxpos[n,:]=np.unravel_index(np.argmax(A[n,:,:,:,:]), A[n,:,:,:,:].shape)
     ...:

In [216]: # Proposed approach
     ...: max_idx = A.reshape(A.shape[0],-1).argmax(1)
     ...: maxpos_vect = np.column_stack(np.unravel_index(max_idx, A[0,:,:].shape))
     ...:

In [219]: # Verify results
     ...: np.array_equal(maxpos.astype(int),maxpos_vect)
Out[219]: True

推广到n维数组

我们可以泛化来解决n-dim数组以获取argmax最后的N轴,并结合类似以下内容:

def argmax_lastNaxes(A, N):
    s = A.shape
    new_shp = s[:-N] + (np.prod(s[-N:]),)
    max_idx = A.reshape(new_shp).argmax(-1)
    return np.unravel_index(max_idx, s[-N:])

结果将是一组索引数组。如果您需要最终输出作为数组,则可以使用np.stacknp.concatenate



 类似资料:
  • 我已经写了这个生产者/消费者问题解决方案。它似乎在工作,而不是无限循环。我的印象是,pthread\u exit(NULL) 会让它停止,但老实说,我已经迷路了。有人能告诉我如何阻止循环的正确方向吗?

  • Highcharts 组合图 以下实例演示了多Y轴的组合。 我们在前面的章节已经了解了 Highcharts 基本配置语法。接下来让我们来看下其他的配置。 配置 yAxis 配置 在 yAxis 属性中添加多条Y轴的值 。 var yAxis = [{ // 第一条Y轴 }, { // 第二条Y轴 },{ // 第三题Y轴 } }] 实例 文件名:hig

  • 问题内容: 我有这个: 我需要的是:“,这是列的总和。 我已经尝试了几个小时了。我以为可以,但是不适用于多维数组。因此,我试图弄清楚如何通过或剪接或其他方式隔离s ,但是每种解决方案似乎都涉及一个循环。我弄乱了,和其他人,但无济于事。我还没有找到一个可以很好地处理多维数组的函数。 我正在运行PHP 5.4。 有人可以告诉我如何在没有循环的情况下求和该列吗? 如果有帮助,则值将永远不会大于,并且值将

  • 问题内容: 我知道熊猫支持次要Y轴,但我很好奇是否有人知道将三次Y轴放置在地块上的方法。目前,我正在用numpy + pyplot来实现这一点,但是对于大数据集来说它的速度很慢。 这是为了在同一张图上绘制具有不同单位的不同测量值,以便于比较(例如,相对湿度/温度/和电导率) 所以真的很好奇是否有人在没有太多工作的情况下就能做到这一点。 [编辑]我怀疑是否有办法做到这一点(没有太多的开销),但是我希

  • 问题内容: 我有以下示例代码: 该子图在同一子图上有两个比例不同的轴,我只希望两个轴都有一个图例。我尝试了上面的代码,它不起作用,仅从ax2中产生细节。有任何想法吗? 问题答案: 我想出了一个可行的解决方案!有没有比这更好的方法了?

  • 在这篇 Matplotlib 教程中,我们将介绍如何在同一子图上使用多个 Y 轴。 在我们的例子中,我们有兴趣在同一个图表及同一个子图上绘制股票价格和交易量。 为此,首先我们需要定义一个新的轴域,但是这个轴域是ax2仅带有x轴的『双生子』。 这足以创建轴域了。我们叫它ax2v,因为这个轴域是ax2加交易量。 现在,我们在轴域上定义绘图,我们将添加: ax2v.fill_between(date[-