如问题所述,我有一个2D矩阵(1000、2000),在该矩阵中,我以numpy where函数应用条件,方法如下:
import numpy as np
A = np.random.randn(1000, 2000)
print(A.shape)
(1000, 2000)
mask = np.where((A >=0.1) & (A <= 0.5))
A = A[mask]
print(A.shape)
(303112,)
我得到一个扁平化矩阵,在仅支持一维矩阵的Fortran程序中用作输入,该程序的输出与输入一维矩阵具有相同的维数(303112,),是否有任何方法或函数可以重建扁平化矩阵转换为其原始2D形式。如果有人知道任何numpy方法或任何建议都会有很大的帮助,我正在考虑将索引保存在布尔矩阵中,并使用它们来重构矩阵。
问候。
IIUC您需要维护掩码的1D索引和2D索引,以便在尝试使用FORTRAN程序更新这些值时,可以切换到1D作为输入,然后切换回2D以更新原始阵列。
您可以用于np.ravel_multi_index
将2D索引转换为1D。然后,您可以使用这些1D索引使用将它们转换回2D np.unravel_index
(尽管由于已经有了2D蒙版,所以无需再次将1D转换为2D。)
import numpy as np
A = np.random.randn(1000, 2000)
mask = np.where((A >=0.1) & (A <= 0.5))
idx_flat = np.ravel_multi_index(mask, (1000,2000)) #FLAT 1D indexes using original mask
idx_2d = np.unravel_index(idx_flat, (1000,2000)) #2D INDEXES using the FLAT 1D indexes
#Comparing the method of using flat indexes and A[mask]
print(np.allclose(A.ravel()[idx_flat],A[mask]))
### True
#Comparing the freshly created 2d indexes to the original mask
print(np.allclose(idx_2d,mask))
### True
这是一个虚拟测试用例,其端到端代码用于(3,3)矩阵。
import numpy as np
#Dummy matrix A and mask
A = np.random.randn(3, 3) #<---- shape (3,3)
mask = np.where(A <= 0.5)
mask[0].shape #Number of indexes in 2D mask
###Output: (6,)
#########################################################
#Flatten 2D indexes to 1D
idx_flat = np.ravel_multi_index(mask, (3,3)) #<--- shape (3,3)
idx_flat.shape #Number of indexes in flattened mask
###Output: (6,)
#########################################################
#Feed the 6 length array to fortran function
def fortran_function(x):
return x**2
flat_array = A.ravel()[idx_flat]
fortran_output = fortran_function(flat_array)
#Number of values in fortran_output
fortran_output.shape
###Output: (6,)
#########################################################
#Create a empty array
new_arr = np.empty((3,3)) #<---- shape (3,3)
new_arr[:] = np.nan
new_arr[mask] = fortran_output #Feed the 1D array to the 2D masked empty array
new_arr
array([[5.63399114e-04, nan, 7.86255167e-01],
[3.94992857e+00, 4.88932044e-02, 2.45489069e+00],
[3.51957270e-02, nan, nan]])
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句