【问题标题】:Numpy - Use values as index of another arraysNumpy - 使用值作为另一个数组的索引
【发布时间】:2020-07-12 23:33:01
【问题描述】:

我遇到了 Numpy 的一个问题,我尝试使用(B 的)每一行的值作为另一个多维数组(A)的索引:

>>> A
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
>>> B
    array([[ 0,  1,  2,  3],
           [ 1,  5,  6,  7],
           [ 8,  9, 10, 11]])
>>> np.clip(B, 0, 2)
    array([[0, 1, 2, 2],
           [1, 2, 2, 2],
           [2, 2, 2, 2]])

这是预期的结果:

array([[0, 1, 2, 2],
       [4, 5, 5, 5],
       [8, 8, 8, 8]])

有什么想法吗?非常感谢您的帮助。

【问题讨论】:

  • np.clip 只是剪辑(即夹住)数组中每个元素的值,所以在你的情况下,它会将值剪辑到 0 到 2 之间。你为什么期望 np.剪辑(...)?
  • 嗨 XPhyro。因为“A”中的行长是 3,所以索引需要在 0 和 2 之间。所以我认为 np.clip 是回答我问题的第一步。
  • 你在这里所做的只是剪裁B元素的值,使它们在[0, 2]的封闭范围内;因此,np.clip 不可能返回一个包含超出此范围的元素的数组,这是您期望它执行的操作(查看预期结果的最后两行中的值 4、5 和 8)。我怀疑np.clip 不是你想要的。您能否详细说明您在这里尝试做什么,也许是步骤?仅从问题本身,我无法理解太多。
  • 我的问题可能确实模棱两可,我很抱歉......让我们考虑 np.clip 的结果已经是'B'。我想用它们在A中的对应关系替换每一行中的值。例如,最后一行用'2'填充,所以我们将它们替换为'8',即A最后一行的索引2处的值。

标签: python python-3.x numpy multidimensional-array indexing


【解决方案1】:

你好像在找np.take_along_axis

A = np.array([
       [0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]]
)
B = np.array([
           [ 0,  1,  2,  3],
           [ 1,  5,  6,  7],
           [ 8,  9, 10, 11]]
)
C = np.clip(B, 0, 2)

res = np.take_along_axis(A, C, 1)
print(res)

【讨论】:

    【解决方案2】:

    试试这个:

    result = np.clip(B, 0, 2)
    for i, row in enumerate(result):
        for j, elem in enumerate(row):
            result[i][j] = A[i][elem]
    

    @hilberts_drinking_problem 的回答之后,我使用timeit 做了一些基准测试。用10,000,000 loops 测试时,答案是103s82s,后者是我的。因此,如果您的数据很小,但如果您要循环很多次,我建议您使用我的答案。如果不是这种情况,我相信 hilberts_drinking_problem 的答案的便利性使其更胜一筹。有关详细信息,请参阅此答案的 cmets。

    请注意,在这两种情况下,我只测试了裁剪后的部分,这意味着前面的准备部分不会干扰基准测试。

    【讨论】:

    • 可能是一个可行的答案,但我正在寻找一个“矢量化”解决方案:/没有可能性?
    • 向量化解是指结果应该是向量形式,还是应该通过一系列向量运算来计算结果?
    • 矢量化操作,因此仅使用 numpy 函数
    • 作为对基准的附带评论,我希望numpy 的性能更好,因为AB 变得更大。例如,对于n = 100; A = B = np.random.randint(0, 100, (n, n)),我看到numpy 的速度提高了 70 倍。如果 AB 仍然很小,而迭代次数变大,Python for 循环可能是可行的。此时,可以考虑使用numba
    • numpy 解决方案对我来说是最好的,因为我有 2.5 亿行 6 列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 2016-03-09
    • 2017-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多