我正在尝试在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
的运行时效率。有更有效的方法吗?
答案 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
:
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]])