不用担心长度,将一个numpy数组插入到另一个数组中

3

当进行以下操作时:

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)

这是完全正常的,因为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个回答

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

告诉代码什么时候停止使用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]

我不得不读两遍并测试它,才意识到它在所有情况下都起作用 :) 很棒的一行代码! - Basj
这利用了A[7:1000]A[7:]一样好的事实。 - hpaulj

0

同样的问题,但是在二维中

Numpy - 在特定位置重叠2个矩阵

在那里,我试图说明最好由您负责确定应该复制 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

有趣的是,虽然这些其他函数比索引更强大,具有剪辑和重复等模式,但我并没有看到它们被广泛使用。我认为这是因为编写处理特殊情况的函数比记住/查找具有许多选项的通用函数更容易。


我想找到一种通用的方法来做到这一点,而不需要计算 len(A[7:]) = 3,即使A的长度为20也应该适用。 - Basj
我认为你必须以某种方式使用 len(A),即使将其隐藏在函数调用中。这不是一个昂贵的计算。 - hpaulj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接