Numpy 如何重复一个数组m次
我有一个数组,例如Numpy 如何重复一个数组m次,numpy,array-broadcasting,Numpy,Array Broadcasting,我有一个数组,例如arr=[1,2,3,4],和m=3。我想用m行创建一个矩阵,重复该数组。示例的输出将是 [[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]] 我该怎么做?我试过了 np.vstack((arr, arr, arr)) 然而,据我所知,只有当我有效地使用了硬核m时,这才有效。您可以使用: import numpy as np arr, m = [1,2,3,4], 3 np.vstack([arr]*m) 输出: array([[1,
arr=[1,2,3,4]
,和m=3
。我想用m
行创建一个矩阵,重复该数组。示例的输出将是
[[1, 2, 3, 4],
[1, 2, 3, 4],
[1, 2, 3, 4]]
我该怎么做?我试过了
np.vstack((arr, arr, arr))
然而,据我所知,只有当我有效地使用了硬核m
时,这才有效。您可以使用:
import numpy as np
arr, m = [1,2,3,4], 3
np.vstack([arr]*m)
输出:
array([[1, 2, 3, 4],
[1, 2, 3, 4],
[1, 2, 3, 4]])
另一方面,为什么需要创建这样一个矩阵?您无需重复阵列即可进行搜索。您可以执行以下操作:
n = [1,2,3,4]
m = 3
i = 0;
array = []
while(i<m):
array.append(n)
i+=1
print(array)
n=[1,2,3,4]
m=3
i=0;
数组=[]
而
[1,2,3,4],[1,2,3,4],[1,2,3,4]numpy中有许多选项:
最简单的方法是,将新轴设置为0:
result = np.stack((arr,) * m, axis=0)
这是的泛化,它可以以相同的方式接受变量m
:
result = np.vstack((arr,) * m)
由于您希望展开第一个维度而不是第二个维度,因此可以使用:
对于这个简单的例子,您可以使用单独重复元素以获得相同的结果。这有点老套,但也可以:
result = np.repeat([arr], m, axis=0)
如果arr
已经是一个numpy数组,则可以更明确地添加前导维度:
result = np.repeat(arr[None, :], m, axis=0)
一个稍微复杂一点的方法,但能更好地展示引擎盖下发生的事情,就是使用:
本着与连接相同的精神,您可以直接使用构造函数:
np.array([arr] * m)
一种丑陋的方法是使用多应用(结合广播):
将dtype设置为非常小的整数类型可以确保结果将升级为数组的实际类型
以前的方法多次复制数组以获取2D数据。但是由于数据是重复的,您实际上不需要复制它。相反,您可以使用创建假第一维度的视图。具体来说,该函数将完全按照您的要求执行:
result = np.broadcast_to(arr, [m, len(arr)])
有一种比以前更通用的方法来表达观点
首先,让我们重申文档中的警告:
警告
使用此功能时必须格外小心,请参见注释
除非您提前知道计划使用的数据类型的字节大小,否则最好确保arr
是一个numpy数组,以便从中获得进展:
arr = np.asanyarray(arr)
result = np.lib.stride_tricks.as_strided(arr, shape=(m, arr.size), strides=(0,) + arr.strides)
在最后两种情况下,如果要将视图扩展到包含每个元素的正确副本的完整缓冲区中,则可以使用以下数据:
result = result.copy()
如果不进行扩展,您将有效地模拟对同一列表的多个引用的行为,其中修改任何元素都会更改同一列中的所有元素。您问题的最后一句话让我感到厌烦。在那之前,听起来您只是试图打印相同的数组M次。堆栈是什么对于@hgs3,如果我将同一个数组打印几次,输出结果将是相同的?谢谢!那就对了works@Katenn如果这回答了您的问题,请将其标记为答案,并在其左侧打勾!这实际上是一个常见的陷阱!list
对象是通过引用的,因此列表是指针的集合;请尝试更改一个数组[1][2] =10
:[[1,2,10,4],[1,2,10,4],[1,2,10,4]。
@Quang-Hoang的答案绕过了这个问题,因为它不是一个列表,而是一个啊好的,谢谢你的回答!你绝对正确right@Schwarztrinker.您也可以使用numpy stride magic模拟列表行为,就像我在回答中显示的最后两种方法一样
result = np.broadcast_to(arr, [m, len(arr)])
arr = np.asanyarray(arr)
result = np.lib.stride_tricks.as_strided(arr, shape=(m, arr.size), strides=(0,) + arr.strides)
result = result.copy()