a=b=np.arange(9).reshape(3,3)
i=np.arange(3)
mask=a<i[:,None,None]+3
和
b[np.where(mask[0])]
>>>array([0, 1, 2])
b[np.where(mask[1])]
>>>array([0, 1, 2, 3])
b[np.where(mask[2])]
>>>array([0, 1, 2, 3, 4])
现在我想将它矢量化并将它们打印在一起,然后尝试
b[np.where(mask[i])]
和b[np.where(mask[i[:,None,None]])]
他们都显示IndexError: too many indices for array
答案 0 :(得分:1)
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),而mask
是(3,3,3)。
应用于数组的布尔掩码产生1d(通过where
应用时相同):
In [170]: a[mask[1,:,:]]
Out[170]: array([0, 1, 2, 3])
2d掩码上的where
产生一个2元素元组,它可以索引2d数组:
In [173]: np.where(mask[1,:,:])
Out[173]: (array([0, 0, 0, 1], dtype=int32), array([0, 1, 2, 0], dtype=int32))
3d掩码上的 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))
让我们尝试将a
扩展为3d并应用蒙版
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])
值存在,但它们已加入。
我们可以计算True
每个平面中mask
的数量,并将其用于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
使用Python级迭代。因此mask
平面上的迭代可能同样好(在这个小例子上快6倍)。
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])]
这指向了所需“矢量化”的基本问题,各个阵列是(3,),(4,)和(5)形状。不同大小的数组是一个强有力的指标,即即使不是不可能,也很难实现真正的“矢量化”。
答案 1 :(得分:0)
尝试打印矢量时,它只能存在于x,y和z维度中。你有4个。