使用另一个列表中的值更改数组(条件)中的值

时间:2017-07-23 15:21:58

标签: python arrays list numpy

我有以下列表:

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]

3 个答案:

答案 0 :(得分:1)

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

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

使用np.in1d()我们有一个带有True的布尔数组,其中b中的元素位于indices中。我们将其重塑为b然后否定,以便我们False(或者,如果你想要,0)我们想要归零b。只需将此矩阵元素与b相乘即可得到它

它的优点是适用于1D,2D,3D,......阵列

答案 1 :(得分:0)

我尝试了这个,它对我有用:

>>> 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]

答案 2 :(得分:0)

这个怎么样?

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]]])