由2D numpy数组重复值创建4D numpy数组

3
我有一个2D的numpy数组,叫做array1,其中包含值。 array1是2x4的尺寸。我想要创建一个4D的numpy数组array2,它的尺寸为20x20x2x4,并且我希望复制array1来得到这个数组。

也就是说,如果array1是:

[[1, 2, 3, 4],
 [5, 6, 7, 8]]

I want

array2[0, 0] = array1
array2[0, 1] = array1
array2[0, 2] = array1
array2[0, 3] = array1
# etc.

我该如何做到这一点?

3个回答

4

一种初始化的方法 -

array2 = np.empty((20,20) + array1.shape,dtype=array1.dtype)
array2[:] = array1

运行时测试 -

In [400]: array1 = np.arange(1,9).reshape(2,4)

In [401]: array1
Out[401]: 
array([[1, 2, 3, 4],
       [5, 6, 7, 8]])

# @MSeifert's soln
In [402]: %timeit np.tile(array1, (20, 20, 1, 1))
100000 loops, best of 3: 8.01 µs per loop

# Proposed soln in this post
In [403]: %timeit initialization_based(array1)
100000 loops, best of 3: 4.11 µs per loop

# @MSeifert's soln for READONLY-view
In [406]: %timeit np.broadcast_to(array1, (20, 20, 2, 4))
100000 loops, best of 3: 2.78 µs per loop

你的元组(20, 20,)中不需要尾随的逗号,这只有在单元素元组中才需要。 :) - MSeifert
时间应该小心处理(对于小数组,我得到大致相同的结果)。因为据我所知,np.broadcast_to是一个常数时间操作。 - MSeifert

3
有两种简单的方法:
np.broadcast_to: np.broadcast_to
array2 = np.broadcast_to(array1, (20, 20, 2, 4))  # array2 is a READONLY-view

还有np.tile函数:

array2 = np.tile(array1, (20, 20, 1, 1))          # array2 is a normal numpy array

如果您不想修改您的array2,那么np.broadcast_to应该非常快速和简单。否则,np.tile或分配给一个新的分配数组(参见Divakars answer)应该是首选。


0

我得到了答案。

array2[:, :, :, :] = array1.copy()

这应该可以很好地工作


1
如果您正在使用已初始化的array2,则不需要使用copy()。 - Divakar
而且您不需要所有的 :, :, :, :,一个简单的 : 也可以通过广播实现。 - MSeifert
1
采用这种复制方法是低效的,因为你正在进行不必要的复制。 - Divakar
1
@Gautam,使用array1.copy()创建的副本是不必要的。你正在将值分配给array2,可以直接从array1中提取,而不是复制array1并从中提取。因此,你可以简单地执行:array2[:, :, :, :] = array1 - Divakar
@Divakar 好的。所以它们在内存中制作了一个数组的内部副本,这就是为什么需要时间的原因。就像在Windows中复制一样。 - Gautam Sreekumar
显示剩余2条评论

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