在Numpy中插入行和列

时间:2015-02-19 18:34:14

标签: python numpy

我有以下代码

row, col = image.shape
print image
for x in range(row):
  for y in range(col):
    image = np.insert(image, [x,y], values=0, axis=1)
print image

运行代码时出现此错误

Traceback (most recent call last):
  File "C:\...\Code.py", line 55, in <module>
    expand(img1)
  File "C:\...\Code.py", line 36, in expand
    image = np.insert(image, [x,y], values=0, axis=1)
  File "C:\Python27\lib\site-packages\numpy\lib\function_base.py", line 3627, in insert
    new[slobj2] = arr
ValueError: array is not broadcastable to correct shape

我希望函数要做的是给出一个大小为i的数组,j它在每行和每列之间插入一行零和一列。

所以,如果我有

`array([[1,2,3], 
        [4,5,6],
        [7,8,9]])`

该函数将返回

的结果
[1,0,2,0,3,0]
[0,0,0,0,0,0]
[4,0,5,0,6,0]
[0,0,0,0,0,0]
[7,0,8,0,9,0]
[0,0,0,0,0,0]

我也试过了,

row, col = image.shape
for x in range(row):
  image = np.insert(image, x, values=0, axis=1)
for y in range(col):
  image = np.insert(image, y, values=0, axis=1)

但我没有得到我想要的结果。

2 个答案:

答案 0 :(得分:5)

避免使用insert和其他逐渐修改数组形状的函数 - 这些类型的函数在NumPy中通常很慢。相反,预分配和填充:

newimage = np.zeros((row*2, col*2))
newimage[::2,::2] = image

答案 1 :(得分:1)

np.insert允许您指定多个插入点。检查它的帮助

image=np.arange(1,10).reshape(3,3)
image=np.insert(image,[1,2,3],0,0)
image=np.insert(image,[1,2,3],0,1)

产生

array([[1, 0, 2, 0, 3, 0],
       [0, 0, 0, 0, 0, 0],
       [4, 0, 5, 0, 6, 0],
       [0, 0, 0, 0, 0, 0],
       [7, 0, 8, 0, 9, 0],
       [0, 0, 0, 0, 0, 0]])

np.insert执行preallocate和fill技巧,但更具普遍性。

在我的时间测试中nneonneo's [::2,::2]插入方法相当快 - 10-30x。但要概括起来可能更难。使用np.insert并不错 - 对于1000x1000阵列,我得到300ms的次数。

使用2个切片进行索引更快。使用np.ix_的更一般的高级索引速度较慢,但​​仍比np.insert快2-3倍。

newimage = np.zeros((2*N,2*N))
ii = np.arange(0,2*N,2)
newimage[np.ix_(ii,ii)] = image