我搜索了之前的问题,并没有找到一个非常适合这个问题。
我将A <#> j 列中所有单元格的值设置为0,行indeces 小于m [j]:
import numpy as np
n = 8
A = np.ones([n,n])
m = np.array([1,1,1,2,2,2,3,4])
for j in range(n):
for i in range(m[j]):
A[i,j] = 0
如果没有&#39; for#39;我如何重写该脚本?环
答案 0 :(得分:4)
您可以使用broadcasted NumPy comparison -
>>> A[np.arange(n)[:, None] < m] = 0
>>>
array([[0., 0., 0., 0., 0., 0., 0., 0.],
[1., 1., 1., 0., 0., 0., 0., 0.],
[1., 1., 1., 1., 1., 1., 0., 0.],
[1., 1., 1., 1., 1., 1., 1., 0.],
[1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1.]])
此处,调用[:, None]
会增加np.arange(n)
的形状,以便针对范围中的每个项目,在<
的每个元素上广播比较m
。这将生成与A
形状相同的布尔掩码,然后将其用于将值设置为0.
注意 - 如果A
保证是一组数组,我建议使用Divakar's solution,这与此非常相似。
答案 1 :(得分:3)
对长度为n
的远程数组使用外部广播比较,以直接获取A
-
A = (m <= np.arange(n)[:,None]).astype(float)
为了提升效果,我们可以使用类型转换来降低精度,例如.astype(np.int)
甚至.astype(np.uint8)
。如果您对布尔数组没问题,请完全跳过类型转换。
对于int
dtypes,我们也可以简单地view
进入它,这为我们节省了一些记忆 -
(m <= np.arange(n)[:,None]).view(np.int8)