[英]Create a 2-d mask from a 1-d NumPy array
我想從numpy數組的行中獲取第一個n值,其中n是在單獨的1-d數組中指定的:
import numpy as np
a = np.zeros((5, 5))
n = [1, 3, 2, 4, 1]
result = [[1, 0, 0, 0, 0],
[1, 1, 1, 0, 0],
[1, 1, 0, 0, 0],
[1, 1, 1, 1, 0],
[1, 0, 0, 0, 0]]
我正在尋找不需要迭代的解決方案,因為結果數組將具有數百萬行。
利用broadcasting
利用n
與范圍數組的外部比較來創建遮罩,從而創建最終數組-
ncols = 5
mask_out = np.greater.outer(n,np.arange(ncols))
樣品運行-
In [19]: n = [1, 3, 2, 4, 1]
In [9]: ncols = 5
# Output as mask
In [10]: np.greater.outer(n,np.arange(ncols))
Out[10]:
array([[ True, False, False, False, False],
[ True, True, True, False, False],
[ True, True, False, False, False],
[ True, True, True, True, False],
[ True, False, False, False, False]])
# Output as array of 0s and 1s
In [11]: np.greater.outer(n,np.arange(ncols)).view('i1')
Out[11]:
array([[1, 0, 0, 0, 0],
[1, 1, 1, 0, 0],
[1, 1, 0, 0, 0],
[1, 1, 1, 1, 0],
[1, 0, 0, 0, 0]], dtype=int8)
如果必須填充已經初始化的數組result
,只需使用mask_out
遮罩該數組,即result[mask_out] = ...
這是一種使用高級索引到模板行數組中的方法:
def f_pp(a, ncol=None):
if ncol is None:
ncol = a.max()
t = np.array([1, 0], 'u1').repeat(ncol)
ts, = t.strides
t = np.lib.stride_tricks.as_strided(t[ncol:], (ncol+1, ncol), (-ts, ts))
return t[a]
使用@Divakar作為參考的時間:
def f_div(a, ncol=None):
if ncol is None:
ncol = a.max()
return np.greater.outer(a, np.arange(ncol))
from timeit import timeit
for ncol, nrow in [(10, 10**7), (100, 10**6), (1000, 10**5), (10000, 10000)]:
a = np.random.randint(0, ncol+1, nrow)
print('\n', ncol, nrow, ':')
print('div', timeit(lambda: f_div(a), number=10))
print('pp ', timeit(lambda: f_pp(a), number=10))
印刷品:
10 10000000 :
div 2.4297873955219984
pp 1.698299034498632
100 1000000 :
div 1.465646200813353
pp 0.4803247870877385
1000 100000 :
div 1.3471891237422824
pp 0.35979613568633795
10000 10000 :
div 0.6783521044999361
pp 0.38309483136981726
我認為您正在嘗試獲得類似的東西? 有可能是一個numpy
具體方法我不知道的是快,但速度不是問題,這應該足夠了:
import numpy as np
a = np.zeros((5, 5))
n = [1, 3, 2, 4, 1]
for index in range(len(n)):
a[index][0:n[index]] = 1
print(a)
產出
[[1。 0. 0. 0. 0.] [1。 1. 1. 0. 0.] [1。 1. 0. 0. 0.] [1。 1. 1. 1. 0.] [1。 0. 0. 0. 0.]]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.