【发布时间】:2020-08-25 13:08:25
【问题描述】:
我正在努力提高 Python 编码能力,但遇到了一个相当标准的问题。 我有一个给定的数组,需要创建一个双行数组。新数组应该以这样的方式对应于原始数组,即新数组中的两行包含与原始数组中的一个值相同的值。 我正在使用 Python 3.7 和 numpy 数组。
例子:
original_array = [[1,2,3],
[4,5,6],
[7,8,9]]
result = [[1,2,3],
[1,2,3],
[4,5,6],
[4,5,6],
[7,8,9],
[7,8,9]]
有一种手动方法可以做到这一点:
result = np.zeros((original_array.shape[0]*2, original_array.shape[1]))
for i in range(result.shape[0]):
result[i]=original_array[i//2]
但是,由于我的应用程序处理非常大的数组,因此我尝试尽可能多地使用库函数。经过一番搜索,我想出了以下内容:
result = np.fromfunction(lambda i,j: original_array[i//2][j],
(original_array.shape[0]*2, original_array.shape[1]),
dtype=int)
但是,此调用会生成一个 4D 数组,其中大多数值仅来自第一行,因此它显然无法按预期方式工作。
为什么这个调用会失败,我怎样才能达到想要的效果?
编辑:
我找到了通话失败的原因。 np.fromfunction(...) 不会直接遍历索引,而是将它们作为数组提供。当结果数组的大小与原始数组不同时,原始数组对索引的访问将不再按预期方式工作。
使用 np.repeat(...) 作为 StupidWolf 建议的作品。
【问题讨论】:
-
这能回答你的问题吗? "Cloning" row or column vectors
-
@AkshaySehgal 据我所知没有,因为我仍然需要手动遍历每一行并将其添加到新数组中
-
不,你不@comblogger,如下面的答案所示,不需要迭代。
-
是的,np.repeat(...) 无需手动迭代即可工作,但我指的是您的链接问题,在这里我没有看到对此案例的有用答案
标签: python arrays numpy multidimensional-array