将numpy数组插入另一个数组而不必担心长度

时间:2015-06-14 20:55:45

标签: python 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中,从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]

3 个答案:

答案 0 :(得分: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

但是,这种方式违背了问题的目的!我确定你更喜欢单行!

答案 1 :(得分: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]

答案 2 :(得分: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的文档告诉我,还有putmaskplacecopyto函数。与put对应的是take

有趣的是,虽然这些其他功能提供的功能比索引更多,但使用剪辑和重复等模式,我不会看到它们被大量使用。我认为这是因为编写处理特殊情况的函数比编辑和查找具有大量选项的常规函数​​更容易。