说有这个数组:
x=np.arange(10).reshape(5,2)
x=array([[0, 1],
[2, 3],
[4, 5],
[6, 7],
[8, 9]])
可以对数组进行切片,以便对于每一行,除了第一行之外,您将行组合成一个新矩阵吗?
例如:
newMatrixArray[0]=array([[0, 1],
[2, 3]])
newMatrixArray[1]=array([[0, 1],
[4, 5]])
newMatrixArray[2]=array([[0, 1],
[6, 7]])
使用for循环这很容易,但有没有pythonic方法呢?
答案 0 :(得分:4)
我们可以形成所有那些行索引,然后简单地索引到x
。
因此,一个解决方案是 -
n = x.shape[0]
idx = np.c_[np.zeros((n-1,1),dtype=int), np.arange(1,n)]
out = x[idx]
示例输入,输出 -
In [41]: x
Out[41]:
array([[0, 1],
[2, 3],
[4, 5],
[6, 7],
[8, 9]])
In [42]: out
Out[42]:
array([[[0, 1],
[2, 3]],
[[0, 1],
[4, 5]],
[[0, 1],
[6, 7]],
[[0, 1],
[8, 9]]])
还有其他各种方法来获取这些指数idx
。我们只是为了好玩而提出一些建议。
一个broadcasting
-
(np.arange(n-1)[:,None] + [0,1])*[0,1]
一个array-initialization
-
idx = np.zeros((n-1,2),dtype=int)
idx[:,1] = np.arange(1,n)
一个cumsum
-
np.repeat(np.arange(2)[None],n-1,axis=0).cumsum(0)
一个 list-expansion -
np.c_[[[0]]*(n-1), range(1,n)]
另外,为了提高效果,请使用np.column_stack
或np.concatenate
代替np.c_
。
答案 1 :(得分:1)
我的方法是列表理解:
np.array([
[x[0], x[i]]
for i in range(1, len(x))
])