假設我有一個包含 10 個元素的陣列:
arr = [1,2,3,4,5,6,7,8,9,10]
然后我想定義一個函式,以這個 arr 作為引數來執行計算,假設這個例子的計算是平均值的差異,例如:
如果 N=2(這意味著將 arr 的元素按順序分組為大小為 2 的組):
results=[]
result_1 = 1 2/2 - 3 4/2
result_2 = 3 4/2 - 5 6/2
result_3 = 5 6/2 - 7 8/2
result_4 = 7 8/2 - 9 10/2
輸出將是:
results = [-2,-2,-2,-2]
如果 N=3(這意味著將 arr 的元素按順序按大小為 3 的組進行分組):
results=[]
result_1 = 1 2 3/3 - 4 5 6/3
result_2 = 4 5 6/3 - 7 8 9/3
輸出將是:
results = [-3,-3]
我想這樣做定義兩個函式:
函式 1 - 創建將用作第二個函式輸入的陣列:
Parameters: array, N
returns: k groups of arrays -> seems to be ((length(arr)/N) - 1)
函式 2 - 將是獲取陣列(2 x 2)并執行計算的函式,在這種情況下,是均值差。
Parameters: array1,array2....arr..arr..
returns: list of the results
重要的提示
我的想法是將這些功能應用于資料流,計算結果將是 PSI(人口穩定性指數)
因此,如果我的流有 10k 個樣本并且我將第一個函式設定為 N=1000,那么第二個函式的輸出將為 1k 個樣本 下一個 1k 個樣本。
該程序將重復直到資料流結束
我試圖在 python 中做到這一點(我已經準備好了 PSI 代碼)但現在我決定使用 Julia,但我對 Julia 還很陌生。因此,如果有人可以在這里給我一些啟發,那將非常有幫助。
uj5u.com熱心網友回復:
在 Julia 中,如果您有一個大的Vector并且想要計算 3 個元素組的一些統計資料,您可以執行以下操作:
julia> a = collect(1:15); #creates a Vector [1,2,...,15]
julia> mean.(eachcol(reshape(a,3,length(a)÷3)))
5-element Vector{Float64}:
2.0
5.0
8.0
11.0
14.0
請注意,reshape和eachcol都是非分配的,因此在此程序中不會復制任何資料。如果長度a不能被3你整除,你可以在整形之前截斷它 - 以避免分配使用view:
julia> a = collect(1:16);
julia> mean.(eachcol(reshape(view(a,1:(length(a)÷3)*3),3,length(a)÷3)))
5-element Vector{Float64}:
2.0
5.0
8.0
11.0
14.0
根據您實際想要做的事情,您可能還想查看OnlineStats.jl https://github.com/joshday/OnlineStats.jl
uj5u.com熱心網友回復:
好吧,我使用 JavaScript 而不是 Python,但在 Python 中也是一樣的......
你需要一個chunks函式,它接受陣列和 chunk_size (N),讓我們說chunks([1,2,3,4], 2) -> [[1,2], [3,4]]
我們有一個 sum 方法,可以將陣列中的所有元素相加sum([1,2]) -> 3;
JavaScript 和 python 都支持 coouting,可以用于惰性求值,以及它的被呼叫Generator函式,這種型別的函式可以暫停執行,并可以按需恢復!這對于計算資料流很有用。
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
// Javascript Doesn't support `chunks` method yet, So we need to create one...
Array.prototype.chunks = function* (N) {
let chunk = [];
for (let value of this) {
chunk.push(value)
if (chunk.length == N) {
yield chunk;
chunk = []
}
}
}
Array.prototype.sum = function () {
return this.reduce((a, b) => a b)
}
function* fnName(arr, N) {
let chunks = arr.chunks(N);
let a = chunks.next().value.sum();
for (let b of chunks) {
yield (a / N) - ((a = b.sum()) / N)
}
}
console.log([...fnName(arr, 2)])
console.log([...fnName(arr, 3)])
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/335751.html
