将行和列插入到numpy数组中

时间:2014-11-11 12:09:27

标签: python numpy

我想在NumPy数组中插入多个行和列。

如果我有一个长度为n_a的正方形数组,例如:n_a = 3

a = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])

我希望得到一个大小为n_b的新数组,其中包含数组azeros(或任何其他长度为1D的{​​{1}}数组在某些行和列上有索引,例如

n_b

所以index = [1, 3] 。然后新数组是:

n_b = n_a + len(index)

我的问题是,如何有效地做到这一点,假设较大的数组b = np.array([[1, 0, 2, 0, 3], [0, 0, 0, 0, 0], [4, 0, 5, 0, 6], [0, 0, 0, 0, 0], [7, 0, 8, 0, 9]]) 远大于n_a

修改

结果:

len(index)

Warren Weckesser的解决方案:0.208 s

wim的解决方案:0.980秒

Ashwini Chaudhary的解决方案:0.955 s

谢谢大家!

4 个答案:

答案 0 :(得分:6)

这是一种方法。它与@ wim的答案有一些重叠,但它使用索引广播将a复制到b,只需一次分配。

import numpy as np

a = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])

index = [1, 3]
n_b = a.shape[0] + len(index)

not_index = np.array([k for k in range(n_b) if k not in index])

b = np.zeros((n_b, n_b), dtype=a.dtype)
b[not_index.reshape(-1,1), not_index] = a

答案 1 :(得分:3)

您可以通过numpy.insert上的两个a来电来执行此操作:

>>> a = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])
>>> indices = np.array([1, 3])
>>> i = indices - np.arange(len(indices))
>>> np.insert(np.insert(a, i, 0, axis=1), i, 0, axis=0)
array([[1, 0, 2, 0, 3],
       [0, 0, 0, 0, 0],
       [4, 0, 5, 0, 6],
       [0, 0, 0, 0, 0],
       [7, 0, 8, 0, 9]])

答案 2 :(得分:1)

由于花式索引返回副本而不是视图, 我只能在两个步骤中思考如何做到这一点。也许一个笨拙的巫师知道更好的方式...

你走了:

import numpy as np

a = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])

index = [1, 3]
n = a.shape[0]
N = n + len(index)

non_index = [x for x in xrange(N) if x not in index]

b = np.zeros((N,n), a.dtype)
b[non_index] = a

a = np.zeros((N,N), a.dtype)
a[:, non_index] = b

答案 3 :(得分:0)

为什么你不能Slice/splice?这有零循环或用于语句。

xlen = a.shape[1]
ylen = a.shape[0]
b = np.zeros((ylen * 2 - ylen % 2, xlen * 2 - xlen % 2))  #accomodates both odd and even shapes
b[0::2,0::2] = a