假設我有一個NumPy整數數組。向量化切片的最小值和最大值可能嗎?
arr = np.random.randint(0, 1000, 1000)
我有兩個陣列lower
和upper
,它們分別代表對arr
切片下限和上限。這些間隔是重疊和可變長度的,但是lowers
和uppers
都保證不減少。
lowers = np.array([0, 5, 132, 358, 566, 822])
uppers = np.array([45, 93, 189, 533, 800, 923])
我想找到分鐘,並通過lowers
和uppers
定義的arr
每個切片的最大,而這些存儲在另一個陣列。
out_arr = np.empty((lowers.size, 2))
什麼是最有效的方式做到這一點?我很擔心,還沒有一個量化的方法,因爲我看不到我如何避開索引在一個循環..
我目前的做法只是簡單
for i in range(lowers.size):
arr_v = arr[lowers[i]:uppers[i]]
out_arr[i,0] = np.amin(arr_v)
out_arr[i,1] = np.amax(arr_v)
其葉子我想要的結果像
In [304]: out_arr
Out[304]:
array([[ 26., 908.],
[ 18., 993.],
[ 0., 968.],
[ 3., 999.],
[ 1., 998.],
[ 0., 994.]])
但這對我的實際數據太慢了。
多少片,esp與'arr'的大小相比?看起來他們長度不一樣?他們可以重疊?圍繞這種迭代的唯一方法是使用'accumulate'。例如'cumsum'可以在某些情況下工作,例如切片和手段。 – hpaulj
@hpaulj是的,它們是可變長度的,重疊的,對於大約10^7個元素的數組,大約有10^5個切片。這些都是我從db讀取的所有輸入,所以我認爲在此之前沒有任何「更好的第一步」的空間。 –
'np.minimum.reduceat'可能適用。這有點挑剔,因爲人們不得不混合上限和下限。最終,人們只會用較小的數值來將問題減少到同一類型。但可能仍然值得。 –