【问题标题】:challenging special numpy operation具有挑战性的特殊 numpy 操作
【发布时间】:2020-06-05 23:37:09
【问题描述】:

我有一个充满数字索引input 的 NumPy 数组。我想检查某些索引 indices 是否在其中。假设inputinput[i] 的第 i 行有条目 j_1<...<j_n,它们的值属于 indices。我想用来自indices 的随机值切换input[i,j_n] 的值。我怎样才能优雅高效地做到这一点?

例子:

输入 = [[1,2,3],[4,5,6],[7,8,9]]

指数 = [2,4,6]

输入 --> [[1,4,3],[4,5,4],[7,8,9]]

【问题讨论】:

  • 不确定我是否理解正确,您是否只想用来自indices 的另一个(可能相同)随机值替换input 中也存在于indices 中的所有值?
  • 随机值是否应该始终相同(如您的示例输出中所示)?

标签: python python-3.x numpy pytorch numpy-ndarray


【解决方案1】:

类似的东西:

import random

input = [[i if i not in indices else random.choice(indices) for i in x] for x in input]

当然,签入set 而不是list 更好:

import random

d = {*indices}
input = [[i if i not in d else random.choice(indices) for i in x] for x in input]

【讨论】:

  • 但这也改变了 j_i
  • 我不太了解你的索引j_ij_n。但我认为您可以在for j, x in enumerate(input) 中使用enumerate 并在if 中添加检查,例如if i < j and i not in d else...
【解决方案2】:

如果我理解正确,你想要这样的东西:

input = np.array([[1, 2, 3],
                  [4, 5, 6],
                  [7, 8, 9]])

indices = [2, 4, 6]

mask = np.isin(input, indices)
# array([[False,  True, False],
#        [ True, False,  True],
#        [False, False, False]])

input[mask] = np.random.choice(indices, np.count_nonzero(mask))
# array([[1, 6, 3],
#        [6, 5, 4],
#        [7, 8, 9]])

【讨论】:

    猜你喜欢
    • 2018-11-25
    • 1970-01-01
    • 2020-10-16
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    相关资源
    最近更新 更多