在2d numpy数组的给定索引之间填入值

时间:2017-07-15 13:26:05

标签: python numpy

给定一个numpy数组,

if (strlen($password) < 6) {

对于一组索引,例如:

a = np.zeros((10,10))

[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

你如何得到&#34;选择&#34;开始和结束索引之间的所有值/范围,并获得以下内容:

start = [0,1,2,3,4,4,3,2,1,0]
end   = [9,8,7,6,5,5,6,7,8,9]

我的目标是选择&#39;列的每个给定索引之间的所有值。

我知道使用result = [[1, 0, 0, 0, 0, 0, 0, 0, 0, 1], [1, 1, 0, 0, 0, 0, 0, 0, 1, 1], [1, 1, 1, 0, 0, 0, 0, 1, 1, 1], [1, 1, 1, 1, 0, 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, 0, 0, 1, 1, 1, 1], [1, 1, 1, 0, 0, 0, 0, 1, 1, 1], [1, 1, 0, 0, 0, 0, 0, 0, 1, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 1]] 可以解决问题,但有更好或更优雅的解决方案吗?

欢迎任何投入!!

1 个答案:

答案 0 :(得分:9)

您可以使用broadcasting -

r = np.arange(10)[:,None]
out = ((start  <= r) & (r <= end)).astype(int)

这将创建一个形状(10,len(start)的数组。因此,如果您需要实际填充一些已初始化的数组filled_arr,请执行 -

m,n = out.shape
filled_arr[:m,:n] = out

示例运行 -

In [325]: start = [0,1,2,3,4,4,3,2,1,0]
     ...: end   = [9,8,7,6,5,5,6,7,8,9]
     ...: 

In [326]: r = np.arange(10)[:,None]

In [327]: ((start  <= r) & (r <= end)).astype(int)
Out[327]: 
array([[1, 0, 0, 0, 0, 0, 0, 0, 0, 1],
       [1, 1, 0, 0, 0, 0, 0, 0, 1, 1],
       [1, 1, 1, 0, 0, 0, 0, 1, 1, 1],
       [1, 1, 1, 1, 0, 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, 0, 0, 1, 1, 1, 1],
       [1, 1, 1, 0, 0, 0, 0, 1, 1, 1],
       [1, 1, 0, 0, 0, 0, 0, 0, 1, 1],
       [1, 0, 0, 0, 0, 0, 0, 0, 0, 1]])

如果您打算将其用作1s作为True的掩码,请跳过转换为int。因此,(start <= r) & (r <= end)将成为面具。