是否有某種方法可以使用 NumPy 對其余維度使用平面索引?我正在嘗試將以下 MATLAB 函式轉換為 Python
function [indices, weights] = locate(values, gridpoints)
indices = ones(size(values));
weights = zeros([2, size(values)]);
for ix = 1:numel(values)
if values(ix) <= gridpoints(1)
indices(ix) = 1;
weights(:, ix) = [1; 0];
elseif values(ix) >= gridpoints(end)
indices(ix) = length(gridpoints) - 1;
weights(:, ix) = [0; 1];
else
indices(ix) = find(gridpoints <= values(ix), 1, 'last');
weights(:, ix) = ...
[gridpoints(indices(ix) 1) - values(ix); ...
values(ix) - gridpoints(indices(ix))] ...
/ (gridpoints(indices(ix) 1) - gridpoints(indices(ix)));
end
end
end
但我無法理解 NumPy 與 MATLAB 的等價物是什么weights(:, ix)——也就是說,僅在剩余維度中進行線性索引。
我希望語法可以直接翻譯,但假設它values是一個 3×4 陣列,然后weights變成一個 2×3×4 陣列。在 MATLAB 中,weights(:, ix)則是一個 2×1 陣列,而在 Python 中weights[:, ix]是一個 2×3 陣列。
我認為我已經處理了下面函式中的所有其他內容。
import numpy as np
def locate(values, gridpoints):
indices = np.zeros(np.shape(values), dtype=int)
weights = np.zeros((2,) np.shape(values))
for ix in range(values.size):
if values.flat[ix] <= gridpoints[0]:
indices.flat[ix] = 0
# weights[:, ix] = [1, 0]
elif values.flat[ix] >= gridpoints[-1]:
indices.flat[ix] = gridpoints.size - 2
# weights[:, ix] = [0, 1]
else:
indices.flat[ix] = (
np.argwhere(gridpoints <= values.flat[ix]).flatten()[-1]
)
# weights[:, ix] = (
# np.array([gridpoints[indices.flat[ix] 1] - values.flat[ix],
# values.flat[ix] - gridpoints[indices.flat[ix]]])
# / (gridpoints[indices.flat[ix] 1] - gridpoints[indices.flat[ix]])
# )
return indices, weights
你有什么建議嗎?也許我只是在想這個問題全錯了。我還嘗試盡可能簡單地撰寫代碼,因為我打算稍后使用 Numba 來加速它。
uj5u.com熱心網友回復:
根據hpaulj的評論,似乎沒有直接的 NumPy 等價物。在缺乏它的情況下,我能想到的最好的方法是weights按照下面的代碼和NumPy 對 Matlab 用戶的建議重塑陣列。
import numpy as np
def locate(values, gridpoints):
indices = np.zeros(values.shape, dtype=int)
weights = np.zeros((2, values.size)) # Temporarily make weights 2-by-N
for ix in range(values.size):
if values.flat[ix] <= gridpoints[0]:
indices.flat[ix] = 0
weights[:, ix] = [1, 0]
elif values.flat[ix] >= gridpoints[-1]:
indices.flat[ix] = gridpoints.size - 2
weights[:, ix] = [0, 1]
else:
indices.flat[ix] = (
np.argwhere(gridpoints <= values.flat[ix]).flatten()[-1]
)
weights[:, ix] = (
np.array([gridpoints[indices.flat[ix] 1] - values.flat[ix],
values.flat[ix] - gridpoints[indices.flat[ix]]])
/ (gridpoints[indices.flat[ix] 1] - gridpoints[indices.flat[ix]])
)
# Give weights correct dimensions
weights.shape = (2,) values.shape
return indices, weights
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/397916.html
