2015-06-14 24 views
3

在做:插入numpy的阵列到另一个,而不必担心长度

import numpy 
A = numpy.array([1,2,3,4,5,6,7,8,9,10]) 
B = numpy.array([1,2,3,4,5,6])  

A[7:7+len(B)] = B       # A[7:7+len(B)] has in fact length 3 ! 

我们得到这个典型错误:

ValueError: could not broadcast input array from shape (6) into shape (3) 

这是100%正常的,因为A[7:7+len(B)]的长度为3,和不是长度= len(B) = 6,因此不能接收B!的内容!

如何防止这种情况发生,并具有B-复制到轻松的内容,开始A[7]

A[7:???] = B[???]  
# i would like [1 2 3 4 5 6 7 1 2 3] 

这可以被称为“自动播放”,即我们不不得不担心阵列的长度


编辑:另一个例子,如果len(A) = 20

A = numpy.array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]) 
B = numpy.array([1,2,3,4,5,6])  

A[7:7+len(B)] = B 
A # [ 1 2 3 4 5 6 7 1 2 3 4 5 6 14 15 16 17 18 19 20] 

回答

1

只要告诉它何时停止使用len(A)

A[7:7+len(B)] = B[:len(A)-7] 

例子:

import numpy 
B = numpy.array([1,2,3,4,5,6])  

A = numpy.array([1,2,3,4,5,6,7,8,9,10]) 
A[7:7+len(B)] = B[:len(A)-7] 
print A # [1 2 3 4 5 6 7 1 2 3] 

A = numpy.array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]) 
A[7:7+len(B)] = B[:len(A)-7] 
print A # [ 1 2 3 4 5 6 7 1 2 3 4 5 6 14 15 16 17 18 19 20] 
+0

我不得不阅读它两次,并进行测试,以实现它在所有情况下工作:)好的一行! – Basj

+0

这利用了“A [7:1000]”与“A [7:]”一样好的事实。 – hpaulj

0

同样的问题,但在2D

Numpy - Overlap 2 matrices at a particular position

在那里,我尽量让,这是更好的情况下,您需要负责确定B的哪一部分应该是警察灭蝇灯:

A[7:] = B[:3] 
A[7:] = B[-3:] 
A[7:] = B[3:6] 

np.put会做这种裁剪对你的,但你必须给它一个索引列表,而不是一个切片:

np.put(x, range(7,len(x)), B) 

这并不比x[7:]=y[:len(x)-7]更好。

put的文档告诉我,还有一个putmask,placecopyto函数。与put对应的是take

一个有趣的事情是,虽然这些其他功能比索引提供更多的权力,像剪辑和重复模式,我没有看到他们使用太多。我认为这是因为写一个处理你的特殊情况的函数比记住/查找具有很多选项的通用函数更容易。

+0

我想找到这样做的一般方式,不具有计算'LEN(A [7:])= 3',应该也行如果A的长度为20,例如 – Basj

+0

我认为你必须以某种方式使用len(A),即使你将它埋在函数调用中。计算并不昂贵。 – hpaulj

1
import numpy 
A = numpy.array([1,2,3,4,5,6,7,8,9,10]) 
B = numpy.array([1,2,3,4,5,6])  

numpy.hstack((A[0:7],B))[0:len(A)] 

第二个想法,其中B里面A. 洙符合这个失败的情况下....

import numpy 
A = numpy.array([1,2,3,4,5,6,7,8,9,10]) 
B = numpy.array([1,2,3,4,5,6])  

if 7 + len(B) > len(A): 
    A = numpy.hstack((A[0:7],B))[0:len(A)] 
else: 
    A[7:7+len(B)] = B 

但是,这种失败的问题的目的!我相信你更喜欢单线!