【问题标题】:Element-wise minimum of two numpy arrays indexed by another array由另一个数组索引的两个 numpy 数组的元素最小值
【发布时间】:2018-07-08 12:30:49
【问题描述】:

我有三个形状数组:

A = a = np.random.exponential(1, [10, 1000000])  # of shape (10, 1000000)
B = a = np.random.exponential(1, [10, 1000000])  # of shape (10, 1000000)

我计算了另一个数组 IND[ ],如下所示。 IND[ ] 的每个元素都是 A 的最大元素的索引(一列中每 10 个值的最大值),

IND = np.argmax(snr_sr, axis=0)  # of shape (1000000,)

我想计算另一个数组 C,其中包含由 IND[ ] 的值指定的第 # 行 A 和 B 的元素最小值。因此,C 数组的形状应为 (1, 1000000)。我想避免 for 循环。我尝试了以下方法,但 C 的值不正确。

for j in range(0, A.shape[1]):    
        m  = ind[j]
        C  = minimum(A[m,:], B[m,:])  # return 1x1000000 array

抱歉,由于数组很大,无法发布。你可以采取任何 相同形状的数组。

第一次编辑: 有人为我提供了正确答案,但他删除了它(不知道为什么?) 无论如何,我在他删除之前复制了答案。请再次发布,以便我标记它是正确的。 (对他来说:为了简单起见,他采用了 1,100 个数组)。

【问题讨论】:

  • 你找到了 argmax 但没有找到 argmin?
  • 首先逐行计算A和B的最小值并将其存储在数组中;然后使用 ind 索引该数组。
  • 您能否提供 2 个包含 5 个元素的数组并向我们展示您需要的预期输出?

标签: python python-3.x numpy array-broadcasting numpy-ndarray


【解决方案1】:

我缩短了你的数组:

a = np.random.exponential(1, [10, 100])  # of shape (10, 100)
b = np.random.exponential(1, [10, 100])
ind=np.argmax(a,axis=0)

使用indab 中每列选择一行:

a_ = a[ind,np.arange(a.shape[1])]
b_ = b[ind,np.arange(a.shape[1])]

然后计算c

c=np.minimum(a_, b_)

【讨论】:

  • 谢谢。它很好地解决了。如果“ind”是 axis=0 上的随机选择而不是最大值怎么办?
  • 应该是一样的,如果ind >9虽然会抛出索引错误
  • 不,我的意思是如果我想要两个数组的随机选择元素的索引而不是 ind = np.argmax(a, axis=0),例如 ind=np.argrandom( a,axis=0)(np.argrandom不存在,我只是好奇这样的函数是否存在?)
  • 计算随机ind?使用random 模块:ind=np.random.randint(0,10,a.shape[0])
  • 我认为它有效。让我通过查看最终结果来验证它。非常感谢布伦拉。你真的很有帮助。
【解决方案2】:

注意:我不精通numpy,所以可能有更有效的解决方案。

首先逐行找出 A 和 B 中的最小值:

minAB = np.min(np.minimum(A, B), axis=1)

然后使用ind索引这个数组:

C = minAB[ind]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 2016-09-24
    • 2016-03-09
    • 2012-01-05
    • 1970-01-01
    相关资源
    最近更新 更多