12

我有两个数组AB未知维度,我想沿着第Nth 维连接。例如:

>>> A = rand(2,2)       # just for illustration, dimensions should be unknown
>>> B = rand(2,2)       # idem
>>> N = 5

>>> C = concatenate((A, B), axis=N)
numpy.core._internal.AxisError: axis 5 is out of bounds for array of dimension 2

>>> C = stack((A, B), axis=N)
numpy.core._internal.AxisError: axis 5 is out of bounds for array of dimension 3

这里提出了一个相关的问题。不幸的是,当维度未知时,提出的解决方案不起作用,我们可能必须添加几个新轴,直到获得最小维度N

我所做的是用 1 将形状扩展到第Nth 维,然后连接:

newshapeA = A.shape + (1,) * (N + 1 - A.ndim)
newshapeB = B.shape + (1,) * (N + 1 - B.ndim)
concatenate((A.reshape(newshapeA), B.reshape(newshapeB)), axis=N)

例如,使用此代码,我应该能够将 (2,2,1,3) 数组与沿轴 3 的 (2,2) 数组连接起来。

有没有更好的方法来实现这一目标?

ps:按照第一个答案的建议更新。

4

3 回答 3

2

这应该有效:

def atleast_nd(x, n):
    return np.array(x, ndmin=n, subok=True, copy=False)

np.concatenate((atleast_nd(a, N+1), atleast_nd(b, N+1)), axis=N)
于 2017-05-09T13:45:57.733 回答
1

我认为您的方法没有任何问题,尽管您可以使代码更紧凑:

newshapeA = A.shape + (1,) * (N + 1 - A.ndim)
于 2013-10-28T15:51:11.663 回答
1

另一种方法,使用numpy.expand_dims

>>> import numpy as np
>>> A = np.random.rand(2,2)
>>> B = np.random.rand(2,2)
>>> N=5


>>> while A.ndim < N:
        A= np.expand_dims(A,x)
>>> while B.ndim < N:
        B= np.expand_dims(B,x)
>>> np.concatenate((A,B),axis=N-1)
于 2013-10-28T15:23:53.323 回答