假设我想要复制一个数组 over 另一个数组的内容,这意味着复制数组的索引会被维护并覆盖第一个数组。在我的例子中,被复制的数组总是长度为3
,而复制的数组将是任意长度。
如果复制数组小于 ,我可以像这样轻松地做到这一点:
>>>a = numpy.zeros(3, int)
>>>a
a = array([0,0,0])
>>>b = numpy.array([2,3])
>>>a[:len(b)] = b
>>>a
a = array([2,3,0])
如果复制数组的颜色大于,那么我也可以这样做:
>>>c = numpy.array([5,6,7,8])
>>>a = c[:3]
>>>a
a = array([5,6,7])
但是有没有更优雅的numpy方法可以做到这一点,而无需编写if
来捕捉这两个条件?类似put()
的内容可以将复制到某个索引吗?
修改
想出了一个可以使用任意大小的数组x
的单行程序:
a[:numpy.min([3, len(x)])] = x[:numpy.min([3, len(x)])
但仍想要更清洁的东西
答案 0 :(得分:4)
对于您的用例:
a[:len(b)] = b[:3]
诀窍是要记住,切割numpy数组的“越过末尾”不会引发错误:
In [1]: foo = np.arange(3)
In [2]: foo
Out[2]: array([0, 1, 2])
In [3]: foo[:64]
Out[3]: array([0, 1, 2])
答案 1 :(得分:3)
对于1D案例,它并不太糟糕:
a[:len(b)] = b[:len(a)]
对于n维a
和b
,事情变得更加混乱,尽管辅助函数仍然合理:
def mismatched_copyto(from, to):
overlap_slices = tuple(slice(None, min(a, b)) for a, b in zip(from.shape, to.shape))
to[overlap_slices] = from[overlap_slices]
如果你想为不匹配的ndim
定义某种广播,它会变得更加混乱。我不认为我会烦恼。