从坐标创建2D Numpy数组

Mik*_*e T 5 python arrays numpy vectorization

我有数据点代表2D数组(矩阵)的坐标.除了某些网格位置缺少数据点之外,这些点经常被网格化.

例如,考虑一些XYZ数据,它们适合具有形状(3,4)的常规0.1网格.有缺口和缺失点,所以有5分,而不是12分:

import numpy as np
X = np.array([0.4, 0.5, 0.4, 0.4, 0.7])
Y = np.array([1.0, 1.0, 1.1, 1.2, 1.2])
Z = np.array([3.3, 2.5, 3.6, 3.8, 1.8])
# Evaluate the regular grid dimension values
Xr = np.linspace(X.min(), X.max(), np.round((X.max() - X.min()) / np.diff(np.unique(X)).min()) + 1)
Yr = np.linspace(Y.min(), Y.max(), np.round((Y.max() - Y.min()) / np.diff(np.unique(Y)).min()) + 1)
print('Xr={0}; Yr={1}'.format(Xr, Yr))
# Xr=[ 0.4  0.5  0.6  0.7]; Yr=[ 1.   1.1  1.2]
Run Code Online (Sandbox Code Playgroud)

我希望看到的是这张图片(背景:黑色=基础0指数;灰色=坐标值;颜色=矩阵值;白色=缺失).

矩阵

这就是我所拥有的,这对于for循环是直观的:

ar = np.ma.array(np.zeros((len(Yr), len(Xr)), dtype=Z.dtype), mask=True)
for x, y, z in zip(X, Y, Z):
    j = (np.abs(Xr -  x)).argmin()
    i = (np.abs(Yr -  y)).argmin()
    ar[i, j] = z
print(ar)
# [[3.3 2.5 -- --]
#  [3.6 -- -- --]
#  [3.8 -- -- 1.8]]    
Run Code Online (Sandbox Code Playgroud)

是否有更多的NumPythonic方法来矢量化返回2D阵列的方法ar?或者for循环是否必要?

der*_*men 7

你可以在一行上完成 np.histogram2d

data = np.histogram2d(Y, X, bins=[len(Yr),len(Xr)], weights=Z)
print(data[0])
[[ 3.3  2.5  0.   0. ]
 [ 3.6  0.   0.   0. ]
 [ 3.8  0.   0.   1.8]]
Run Code Online (Sandbox Code Playgroud)