我有以下代码
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)
但我没有得到我想要的结果。
答案 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