扩展数组的维度

时间:2018-01-19 04:37:52

标签: python arrays numpy

我正在编写一个有限差分工具包,在我的班级中我收到一个数组,为了示例,将其定义为:

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

所有这些方法对我都有一些问题:

  1. 至少对我而言,使用其他值进行时间维度是很难看的,例如,如果我想要时间维度中的5个元素,我需要做一些像...(b, np_zeros_like(b), np_zeros_like(b), np_zeros_like(b), np_zeros_like(b))...这样不优雅的事情。

  2. 我必须从(...)( 3, 1, 1, 1 )(...)构建元组a.ndim,而不是优雅。

  3. 是最好的(imho)。但我想知道我是否可以用零扩展,因为从一开始就不需要明确设置它。

  4. 执行此操作的任何numpy方法(或其他任何方法)?

1 个答案:

答案 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)

我自己会使用第一个。