我不知道我正在寻找的东西的一般情况/单词,所以这里是一个例子。我创建了一个矩阵
test = np.arange(0, 100, 1).reshape((5,5,-1))
idx = test > 50
现在test[idx]
会给我test > 50
的值。 idx
包含一组满足我条件的元素。说idx
idx==TRUE
所在的指数(实际上不是真的,只是示例)
(1,1,1)
(2,1,1)
(3,1,1)
(4,2,4)
然后我想创建一个新矩阵idx2
,使其仅在
(1,1,0)
(2,1,0)
(3,1,0)
(4,2,0)
即非正式地说,我正在寻找
test > 50 & "switch axis=2 value from whatever it was to 0"
也许有人理解我的要求可以改写这个问题,特别是标题,并删除我的毛茸茸......谢谢:)
我很遗憾无法在3d情况下给出idx2
的输出,但在不太有意义的2d情况下,idx
的外观如下:
test = np.arange(0, 10, 1).reshape((5, -1), order='F')
idx = test > 5
idx
array([[False, False],
[False, True],
[False, True],
[False, True],
[False, True]], dtype=bool)
现在,test > 5 and reset axis=1 to 0
将是:
idx2
array([[False, False],
[True, False],
[True, False],
[True, False],
[True, False]], dtype=bool)
答案 0 :(得分:1)
如果我理解这个问题,我想你想使用or
函数减少数组中的一个轴,类似于python内置reduce
的方式。
Numpy函数有一个名为reduce
的方法:
idx2 = np.zeros_like(idx)
idx2[:,:,0] = np.logical_or.reduce(idx, axis=2)
以下是结果。我相信您希望这一点满足的条件是idx[i][j][k]
True
,idx2[i][j][0]
也是True
,i
的任何其他值}和j
,idx2[i][j]0]
是False
。
我相信以下内容令人满意。 在这里你有idx:
array([[[False, False, False, False],
[False, False, False, False],
[False, False, False, False],
[False, False, False, False],
[False, False, False, False]],
[[False, False, False, False],
[False, False, False, False],
[False, False, False, False],
[False, False, False, False],
[False, False, False, False]],
[[False, False, False, False],
[False, False, False, False],
[False, False, False, True],
[ True, True, True, True],
[ True, True, True, True]],
[[ True, True, True, True],
[ True, True, True, True],
[ True, True, True, True],
[ True, True, True, True],
[ True, True, True, True]],
[[ True, True, True, True],
[ True, True, True, True],
[ True, True, True, True],
[ True, True, True, True],
[ True, True, True, True]]], dtype=bool)
这是idx2:
array([[[False, False, False, False],
[False, False, False, False],
[False, False, False, False],
[False, False, False, False],
[False, False, False, False]],
[[False, False, False, False],
[False, False, False, False],
[False, False, False, False],
[False, False, False, False],
[False, False, False, False]],
[[False, False, False, False],
[False, False, False, False],
[ True, False, False, False],
[ True, False, False, False],
[ True, False, False, False]],
[[ True, False, False, False],
[ True, False, False, False],
[ True, False, False, False],
[ True, False, False, False],
[ True, False, False, False]],
[[ True, False, False, False],
[ True, False, False, False],
[ True, False, False, False],
[ True, False, False, False],
[ True, False, False, False]]], dtype=bool)
在更简单的2d情况下,
test = np.arange(0, 10, 1).reshape((5, -1), order='F')
idx = test > 5
idx2 = np.zeros_like(idx)
idx2[:,0] = np.logical_or.reduce(idx, axis=1) # Note the reduction in dimension of the slicing, and that axis=1
idx2
array([[False, False],
[ True, False],
[ True, False],
[ True, False],
[ True, False]], dtype=bool)
如果你想要一个通用功能,这里有一个适用于任意数量的维度:
def logical_flatten(array_in):
array_out = np.zeros_like(array_in)
array_out[[Ellipsis for k in range(len(array_in.shape)-1)]+[0]] = np.logical_or.reduce(array_in, axis=len(array_in.shape)-1)
return array_out
答案 1 :(得分:1)
test=np.arange(0,100,1).reshape(5,5,-1)
idx=test>50
X,Y,Z=np.nonzero(idx)
这些是非零指数,分为3个数组。
现在制作副本,但Z
全为0
idx1=np.zeros_like(idx)
idx1[X,Y,np.zeros_like(Z)]=True
np.nonzero(idx)
生成
(array([2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
4, 4, 4], dtype=int32),
array([2, 3, 3, 3, 3, 4, 4, 4, 4, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3,
3, 3, 4, 4, 4, 4, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4,
4, 4, 4], dtype=int32),
array([3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1,
2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0,
1, 2, 3], dtype=int32))
虽然np.nonzero(idx1)
是
(array([2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4], dtype=int32),
array([2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4], dtype=int32),
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=int32))
明显省略Y
,它适用于你的第二个例子。