如何在保持索引的同时将一个numpy数组的内容复制到另一个?

时间:2015-12-16 19:56:05

标签: python arrays numpy

假设我想要复制一个数组 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)])

但仍想要更清洁的东西

2 个答案:

答案 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维ab,事情变得更加混乱,尽管辅助函数仍然合理:

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定义某种广播,它会变得更加混乱。我不认为我会烦恼。