猿问

如何在python中正确索引一个大矩阵

我有一个包含某些条目的大 numpy 数组。假设一个虚拟示例是:


    arr = np.array([[[1.0, 2.0, 3.0],[1.5, 1.8, 3.2]],

                    [[1.3, 1.7, 1.9],[1.4, 1.9, 2.1]],

                    [[1.8, 2.2, 2.5],[2.0, 2.2, 2.8]]])

我想知道条目arr落在某个范围内的所有索引,比如1.5和2.4。并且我想填充另一个arr与1at具有相同形状的矩阵,其中的值arr在范围内,否则使用0. 也就是说,我想得到一个矩阵,如:


mask = np.array([[[0, 1, 0], [1, 1, 0]],

                 [[0, 1, 1], [0, 1, 1]],

                 [[1, 1, 0], [1, 1, 0]]])

有什么简单的numpy技巧可以做到这一点吗?我知道用 a 来做这件事很简单for loop,但由于我的arr尺寸很大,我希望它相当快。谢谢


GCT1015
浏览 266回答 2
2回答

暮色呼如

创建满足您条件的布尔掩码。将 0 添加到布尔值会将它们转换为数字结果:import numpy as nparr = np.array([[[1.0, 2.0, 3.0],[1.5, 1.8, 3.2]],&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [[1.3, 1.7, 1.9],[1.4, 1.9, 2.1]],&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [[1.8, 2.2, 2.5],[2.0, 2.2, 2.8]]])arr_out = ((arr>=1.5) & (arr<=2.4)) + 0print(arr_out)或者:arr_out = np.array(((arr>=1.5) & (arr<=2.4)), dtype=np.uint8)print(arr_out)或者,正如@hpaulj 所建议的:arr_out = ((arr>=1.5) & (arr<=2.4)).astype(int)print (arr_out)输出:[[[0 1 0]&nbsp; [1 1 0]]&nbsp;[[0 1 1]&nbsp; [0 1 1]]&nbsp;[[1 1 0]&nbsp; [1 1 0]]]

温温酱

您可以使用掩码和np.where:首先创建一个结合两个边界条件的条件掩码,然后将其传递给np.where. 矩阵将1在此条件成立的情况下分配为True 否则,0如果其为 False最小的工作答案import numpy as nparr = np.array([[[1.0, 2.0, 3.0],[1.5, 1.8, 3.2]],&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [[1.3, 1.7, 1.9],[1.4, 1.9, 2.1]],&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [[1.8, 2.2, 2.5],[2.0, 2.2, 2.8]]])mask = ((arr>1.5) & (arr<2.4))arr = np.where(mask, 1, 0)print (arr)输出array([[[0, 1, 0],&nbsp; &nbsp; &nbsp; &nbsp; [0, 1, 0]],&nbsp; &nbsp; &nbsp; &nbsp;[[0, 1, 1],&nbsp; &nbsp; &nbsp; &nbsp; [0, 1, 1]],&nbsp; &nbsp; &nbsp; &nbsp;[[1, 1, 0],&nbsp; &nbsp; &nbsp; &nbsp; [1, 1, 0]]])
随时随地看视频慕课网APP

相关分类

Python
我要回答