m = np.random.randint(4,size=(4,4,4))
比方说,我想为每个这样的整数创建单独的数组
mm=[]
mm.append((m==1).astype(int))
mm.append((m==2).astype(int))
mm.append((m==3).astype(int))
我想知道是否有更好的方法无需显式定义m==1
等。是否可以像在Matlab中一样轻松地在python中实现多维数组的隐式扩展方法? post中显示了吗?
答案 0 :(得分:5)
利用broadcasting
-
mm = m == np.arange(1,4)[:,None,None,None]
请注意,我们使用None
作为np.newaxis
的别名来扩展范围数组的尺寸,以便通过相等比较,我们有效地对{{1}中的所有元素进行逐元素比较}对所有范围数组。这样做是为了使broadcasting
受到影响。
对于将n维数组m
与值数组进行比较的一般情况,例如:m
,我们将使用重塑来产生相同的维数扩展效果,如下所示-
ar = np.array([1,2,3])
或者,使用内置的mm = m == ar.reshape((-1,)+(1,)*m.ndim)
,因为我们实际上是在进行外部相等比较-
np.equal.outer
最后,将ind dtype数组转换为mm = np.equal.outer(ar,m)
:int
。
答案 1 :(得分:3)
mm = [(m==n).astype(int) for n in np.unique(m)]
会为您提供masks
m
上的m