python中的隐式扩展?

时间:2018-08-01 21:03:14

标签: python numpy

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中显示了吗?

2 个答案:

答案 0 :(得分:5)

利用broadcasting-

将ndim数组作为输出
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

中所有 unique 值的m上的m