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()