In [165]: a
Out[165]:
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
In [166]: mask
Out[166]:
array([[[ True, True, True],
[False, False, False],
[False, False, False]],
[[ True, True, True],
[ True, False, False],
[False, False, False]],
[[ True, True, True],
[ True, True, False],
[False, False, False]]], dtype=bool)
그래서 a
(및 b
)는 (3,3)입니다 있습니다.
배열인가 부울 마스크는 1D (where
통해인가 될 때와 동일)이 생성
In [170]: a[mask[1,:,:]]
Out[170]: array([0, 1, 2, 3])
차원 마스크
where
는 2 소자 터플 생성을 할 수있는 인덱스를 2 차원 배열 :
차원 마스크
In [173]: np.where(mask[1,:,:])
Out[173]: (array([0, 0, 0, 1], dtype=int32), array([0, 1, 2, 0], dtype=int32))
where
는 3 원소 튜플 - 따라서 too many indices
에러 :
In [174]: np.where(mask)
Out[174]:
(array([0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2], dtype=int32),
array([0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1], dtype=int32),
array([0, 1, 2, 0, 1, 2, 0, 0, 1, 2, 0, 1], dtype=int32))
는 이제
In [176]: np.tile(a[None,:],(3,1,1)).shape
Out[176]: (3, 3, 3)
In [177]: np.tile(a[None,:],(3,1,1))[mask]
Out[177]: array([0, 1, 2, 0, 1, 2, 3, 0, 1, 2, 3, 4])
값이있는 마스크를 3D 및 적용 a
을 확대 해 봅시다,하지만 그들은 결합됩니다.
우리는 mask
의 각면에 True
의 수를 계산하고, split
에 마스크 된 타일이를 사용할 수 있습니다
In [185]: mask.sum(axis=(1,2))
Out[185]: array([3, 4, 5])
In [186]: cnt=np.cumsum(mask.sum(axis=(1,2)))
In [187]: cnt
Out[187]: array([ 3, 7, 12], dtype=int32)
In [189]: np.split(np.tile(a[None,:],(3,1,1))[mask], cnt[:-1])
Out[189]: [array([0, 1, 2]), array([0, 1, 2, 3]), array([0, 1, 2, 3, 4])]
는 내부적으로
np.split
파이썬 수준의 반복을 사용합니다. 그래서
mask
비행기의 반복은 (이 작은 예에서는 6 배 빨라지는 것처럼) 좋을 수도 있습니다. 원하는 '벡터화'개별 어레이 (3)이고, (4) 및 (5) 형상의 근본적인 문제를 가리키는
In [190]: [a[m] for m in mask]
Out[190]: [array([0, 1, 2]), array([0, 1, 2, 3]), array([0, 1, 2, 3, 4])]
. 크기 배열이 다르면 실제로 '벡터화'가 불가능하지는 않더라도 어렵다는 강력한 지표입니다.
나는 이것이 당신이 원하는 것을 전혀하지 않습니다. 특히 배열의 진리 값이 취해지기 때문에'np.where (mask [0]) [0]'은 모두'True'이고 (적어도 하나의 요소가 참이면'True'가됩니다), 또한 여러분은 'np.where()'의 두 반환 값을 사용하여, 나는 당신이 원하는 것이라고 생각하지 않는다. – remram