【问题标题】:Change values in array (condition) with values from another list用另一个列表中的值更改数组(条件)中的值
【发布时间】:2017-07-23 15:21:58
【问题描述】:

我有以下清单:

indices
>>> [21, 43, 58, 64, 88, 104, 113, 115, 120]

我希望此列表中这些值的每次出现 -1(如 20、42、57 等)从我拥有的 3D 数组“q”中归零。

我尝试过列表推导、for 和 if 循环(见下文),但我总是收到以下错误:

ValueError:具有多个元素的数组的真值是 模糊的。使用 a.any() 或 a.all()

我无法解决这个问题。

任何帮助都会很棒!

>>> for b in q:
...     for u in indices:
...         if b==u:
...             b==0


>>> for u in indices:
...     q = [0 if x==u else x for x in q]

【问题讨论】:

  • 您希望它们被删除还是只是归零?为什么不比较x == u-1
  • 如果 q 是 3D 数组,则需要再嵌套一个 for 循环
  • 你在使用 numpy 吗?
  • 是的,我正在使用 numpy。我想将索引中的每个值归零。 trincot,你能解释一下吗?

标签: python arrays list numpy


【解决方案1】:

我认为这是一种简短而有效的方法:

b= b*np.logical_not(np.reshape(np.in1d(b,indices),b.shape))

使用 np.in1d() 我们有一个布尔数组,其中 b 中的元素位于 indices 中。我们将它重塑为b,然后取反,这样我们就有False(或者,如果你愿意,0)我们想要将b归零。只需将此矩阵元素与 b 相乘,就可以了

它的优点是它适用于 1D、2D、3D... 数组

【讨论】:

  • 神奇:创新、简单、高效。
【解决方案2】:

这个怎么样?

indices = range(1, 10)
>>[1, 2, 3, 4, 5, 6, 7, 8, 9]

q = np.arange(12).reshape(2,2,3)
array([[[ 0,  1,  2],
        [ 3,  4,  5]],

       [[ 6,  7,  8],
        [ 9, 10, 11]]])

def zeroed(row):
    new_indices = map(lambda x: x-1, indices)
    nrow = [0 if elem in new_indices else elem for elem in row]
    return now

np.apply_along_axis(zeroed, 1, q)

array([[[ 0,  0,  0],
        [ 0,  0,  0]],

       [[ 0,  0,  0],
        [ 9, 10, 11]]])

【讨论】:

    【解决方案3】:

    我试过了,它对我有用:

    >>> arr_2D = [3,4,5,6]
    >>> arr_3D = [[3,4,5,6],[2,3,4,5],[4,5,6,7,8,8]]
    >>> for el in arr_2D:
    ...    for x in arr_3D:
    ...       for y in x:
    ...          if y == el - 1:
    ...             x.remove(y)
    ... 
    >>> arr_3D
    [[6], [], [6, 7, 8, 8]]
    

    在这种情况下,用列表推导接缝来做这件事可能有点矫枉过正。

    或者归零而不是删除

    >>> for el in arr_2D:
    ...    for x in range(len(arr_3D)):
    ...       for y in range(len(arr_3D[x])):
    ...           if arr_3D[x][y] == el - 1:
    ...               arr_3D[x][y] = 0
    ... 
    >>> arr_3D
    [[0, 0, 0, 6], [0, 0, 0, 0], [0, 0, 6, 7, 8, 8]]
    

    这里是列表理解:

    zero_out = lambda arr_2D, arr_3D: [[0 if x in [el-1 for el in arr_2D] else x for x in y] for y in arr_3D]
    

    【讨论】:

    • 你运行的是什么版本的python?
    • 也许是您的代码的另一部分导致了问题?你试过直接在解释器中运行它吗?
    • Python 3.6.0;是的,所有内容都直接在解释器中处理。 J. Torrecilla 的回答解决了问题,但仍然不确定为什么这不起作用。但据我了解,numpy 导致了这种歧义问题
    • 在这个例子中我运行的是 python 2.7
    猜你喜欢
    • 1970-01-01
    • 2020-08-20
    • 2022-11-04
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    相关资源
    最近更新 更多