如何解决从两个多维numpy数组复制到另一个具有不同形状的数组
我有两个以下形状的numpy数组:
print(a.shape) -> (100,20,3,3)
print(b.shape) -> (100,3)
数组a
为空,因为我只需要这种预定义的形状,所以我用以下方法创建了它:
a = numpy.empty(shape=(100,3))
现在,我想将数据从数组b
复制到数组a
,以便数组a
的第二维和第三个维被对应的行的相同3个值填充数组b
。
让我尝试使其更加清晰:
数组b
包含100行( 100 ,3),每行包含三个值(100, 3 )。
现在,数组a
( 100 ,20、3、3)的每一行在最后一个维度(100、20、3, 3 ),而对于同一行的第二维和第三维(100, 20 , 3 ,3),这三个值保持不变( 100 ,20、3、3)。
我希望我能传达我的问题。 如何在不使用循环的情况下如上所述复制数据? 我只是无法完成它,但是对此必须有一个简单的解决方案... 谢谢。
解决方法
您可以在repeat
中使用axis
。您也不需要预定义a
。我也建议不要使用broadcast_to
,因为它会返回只读视图,并且内存在元素之间共享:
a = np.repeat(b[:,None,:],20,1) #adds dimensions 1 and 2 and repeats 20 times along axis 1
a = np.repeat(a,3,2) #repeats 3 times along axis 2
小例子:
b = np.arange(2*3).reshape(2,3)
#[[0 1 2]
# [3 4 5]]
a = np.repeat(b[:,2,1)
a = np.repeat(a,2)
#shape(2,3)
[[[[0 1 2]
[0 1 2]
[0 1 2]]
[[0 1 2]
[0 1 2]
[0 1 2]]]
[[[3 4 5]
[3 4 5]
[3 4 5]]
[[3 4 5]
[3 4 5]
[3 4 5]]]]
,
我们可以使用np.broadcast_to
。
如果您认为还可以--
np.broadcast_to(b[:,(100,3))
如果需要具有自己的存储空间的输出,只需附加.copy()
。
如果要节省内存并填充已经定义的数组,请a
:
a[:] = b[:,:]
请注意,我们可以跳过后面的:
。
时间:
In [20]: b = np.random.rand(100,3)
In [21]: %timeit np.broadcast_to(b[:,3))
5.93 µs ± 64.4 ns per loop (mean ± std. dev. of 7 runs,100000 loops each)
In [22]: %timeit np.broadcast_to(b[:,3)).copy()
11.4 µs ± 56.2 ns per loop (mean ± std. dev. of 7 runs,100000 loops each)
In [23]: %timeit np.repeat(np.repeat(b[:,1),2)
39.3 µs ± 147 ns per loop (mean ± std. dev. of 7 runs,10000 loops each)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。