替换python中重复的np.vstack的有效方法?

替换python中重复的np.vstack的有效方法?,python,numpy,Python,Numpy,我试图用python实现这一点 import numpy as np x = np.array([0,0,0]) for r in range(3): x = np.vstack((x, np.array([-r, r, -r]))) x获取此值 array([[ 0, 0, 0], [ 0, 0, 0], [-1, 1, -1], [-2, 2, -2]]) 我担心重复np.vstack的运行效率。有更有效的方法吗?您可以使用以

我试图用python实现这一点

import numpy as np
x = np.array([0,0,0])
for r in range(3):
    x = np.vstack((x, np.array([-r, r, -r])))
x
获取此值

array([[ 0,  0,  0],
       [ 0,  0,  0],
       [-1,  1, -1],
       [-2,  2, -2]])
我担心重复
np.vstack
的运行效率。有更有效的方法吗?

您可以使用以下方法:

  • 首先创建一个块,该块当前正在for循环中执行
  • 最后,使用
    np.vstack
    垂直堆叠一行零,以获得最终所需答案

使用它有用吗

第一行设置第一行零之后的预期行数。第二种方法是创建一个NumPy数组,初始值为0,然后是线性序列0,-1,-2,直到
-N+1
。注意splat操作符的使用,它解压缩
范围
对象并在单个列表中创建元素。这些值与第一个值0相连,我们创建一个2D NumPy数组,它是一个列向量。第三行将该向量水平平铺N次,以获得所需的输出。最后,第四行对第二列求反,以获得所需的输出

示例运行
建立一个数组或列表列表,并将
np.array
(或
vstack
)应用于该列表一次:

In [598]: np.array([[-r,r,-r] for r in [0,0,1,2]])                                                    
Out[598]: 
array([[ 0,  0,  0],
       [ 0,  0,  0],
       [-1,  1, -1],
       [-2,  2, -2]])
但如果列模式一致,则两个阵列相互广播的速度会更快

In [599]: np.array([-1,1,-1])*np.array([0,0,1,2])[:,None]                                             
Out[599]: 
array([[ 0,  0,  0],
       [ 0,  0,  0],
       [-1,  1, -1],
       [-2,  2, -2]])

第二列必须是正数。@rayryeng:再次感谢。我现在做得更多了。只有尺寸需要在广播中指定。很好+1.有其他方法总是好的+1.
In [175]: N = 3

In [176]: A = np.array([[0, *range(0, -N, -1)]]).T

In [177]: B = np.tile(A, (1, N))

In [178]: B[:,1] = -B[:,1]

In [178]: B
Out[178]:
array([[ 0,  0,  0],
       [ 0,  0,  0],
       [-1,  1, -1],
       [-2,  2, -2]])
In [598]: np.array([[-r,r,-r] for r in [0,0,1,2]])                                                    
Out[598]: 
array([[ 0,  0,  0],
       [ 0,  0,  0],
       [-1,  1, -1],
       [-2,  2, -2]])
In [599]: np.array([-1,1,-1])*np.array([0,0,1,2])[:,None]                                             
Out[599]: 
array([[ 0,  0,  0],
       [ 0,  0,  0],
       [-1,  1, -1],
       [-2,  2, -2]])