我有以下列表:
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]
答案 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]]])