给定一个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]]
可以解决问题,但有更好或更优雅的解决方案吗?
欢迎任何投入!!
答案 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)
将成为面具。