我正在编写一个有限差分工具包,在我的班级中我收到一个数组,为了示例,将其定义为:
a=np.ones((5,4,3))
这是一个空间网格,我再添加一个维度来进行基于时间的评估,为了简单起见,这个时间维度将有3个元素,为此我能做到:
1
b=np.expand_dims(a, axis=0)
b=np.concatenate((b, np.zeros_like(b), np.zeros_like(b)), axis=0)
或, 2。
c=np.tile(a, (3,) + (1,) * a.ndim)
c[1] = 0
c[2] = 0
或, 3。
d=np.broadcast_to(a, (3, *a.shape)).copy()
d[1] = 0
d[2] = 0
所有这些方法对我都有一些问题:
至少对我而言,使用其他值进行时间维度是很难看的,例如,如果我想要时间维度中的5个元素,我需要做一些像...(b, np_zeros_like(b), np_zeros_like(b), np_zeros_like(b), np_zeros_like(b))...
这样不优雅的事情。
我必须从(...)( 3, 1, 1, 1 )(...)
构建元组a.ndim
,而不是优雅。
是最好的(imho)。但我想知道我是否可以用零扩展,因为从一开始就不需要明确设置它。
执行此操作的任何numpy方法(或其他任何方法)?
答案 0 :(得分:2)
有两种选择:
e = np.zeros((3,) + a.shape, dtype=a.dtype)
e[0] = a
f = np.einsum('i,...->i...', np.r_[1, np.zeros((3-1,))], a)
g = np.outer(0==np.arange(3), a).reshape((-1,) + a.shape)
h = np.where(0**np.array(range(3), ndmin=a.ndim+1).T, a, 0)
我自己会使用第一个。