更改索引集
Change set of indices
我不知道我要找的东西的一般情况/单词,所以这里有一个例子。我创建一个矩阵
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
,这样它只在
上有 TRUE 元素
(1,1,0)
(2,1,0)
(3,1,0)
(4,2,0)
也就是通俗地说,我在找
test > 50 & "switch axis=2 value from whatever it was to 0"
也许理解我的要求的人可以重新表述问题,尤其是标题,并删除我的绒毛...谢谢 :)
二维示例
不幸的是,如果 idx2
在 3d 情况下,我无法给出输出,但在不太有意义的 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)
如果我理解这个问题,我认为您想使用 or
函数减少数组中的一个轴,类似于使用 python 内置函数 [=16] =].
Numpy 函数有一个类似于 reduce
:
的方法
idx2 = np.zeros_like(idx)
idx2[:,:,0] = np.logical_or.reduce(idx, axis=2)
这是结果。我相信您希望它满足的条件是,对于 True
的任何 idx[i][j][k]
,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
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
它适用于您的二维示例。
我不知道我要找的东西的一般情况/单词,所以这里有一个例子。我创建一个矩阵
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"
也许理解我的要求的人可以重新表述问题,尤其是标题,并删除我的绒毛...谢谢 :)
二维示例
不幸的是,如果 idx2
在 3d 情况下,我无法给出输出,但在不太有意义的 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)
如果我理解这个问题,我认为您想使用 or
函数减少数组中的一个轴,类似于使用 python 内置函数 [=16] =].
Numpy 函数有一个类似于 reduce
:
idx2 = np.zeros_like(idx)
idx2[:,:,0] = np.logical_or.reduce(idx, axis=2)
这是结果。我相信您希望它满足的条件是,对于 True
的任何 idx[i][j][k]
,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
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
它适用于您的二维示例。