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

时间:2019-05-27 23:45:02

标签: python numpy

我正在尝试在python中实现此post

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的运行时效率。有更有效的方法吗?

3 个答案:

答案 0 :(得分:4)

构建数组列表或列表,然后将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]])

答案 1 :(得分:1)

您可以按以下方式使用np.block

  • 首先创建一个当前正在for循环内执行的块
  • 最后,使用const panels = document.querySelectorAll('.panel'); document.querySelector('.intro-panels').onclick = e =>{ let sct = e.target.closest('section'); if (!sct || !sct.classList.contains('panel') ) return; e.stopPropagation(); let refPanel = /panel[1-4]/.exec(sct.className)[0]; panels.forEach(p=>{ if (p.classList.contains(refPanel)) { p.classList.toggle('active') } else { p.classList.toggle('inactive') } }) } 垂直堆叠零行以获得最终所需的答案

np.vstack

答案 2 :(得分:1)

使用numpy.tile是否有用?

 N = 3
 A = np.array([[0, *range(0, -N, -1)]]).T
 B = np.tile(A, (1, N))
 B[:,1] = -B[:,1]

第一行设置第一行零之后的预期行数。第二个通过创建初始值0,然后是线性序列0,-1,-2,直至-N + 1来创建NumPy数组。注意使用splat运算符可以解压缩range对象并在单个列表中创建元素。它们与第一个值0连接在一起,我们创建了一个2D NumPy数组,它是一个列向量。第三行将此向量水平平铺N次以获得所需的输出。最后,第四行使第二列取反,以获得所需的输出

示例运行

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