为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

GCT1015 2021-11-16 10:48:17
我有一个包含某些条目的大 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尺寸很大,我希望它相当快。谢谢
查看完整描述

2 回答

?
暮色呼如

TA贡献1853条经验 获得超9个赞

创建满足您条件的布尔掩码。将 0 添加到布尔值会将它们转换为数字结果:


import numpy as np


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_out = ((arr>=1.5) & (arr<=2.4)) + 0

print(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]

  [1 1 0]]


 [[0 1 1]

  [0 1 1]]


 [[1 1 0]

  [1 1 0]]]


查看完整回答
反对 回复 2021-11-16
?
温温酱

TA贡献1752条经验 获得超4个赞

您可以使用掩码和np.where:首先创建一个结合两个边界条件的条件掩码,然后将其传递给np.where. 矩阵将1在此条件成立的情况下分配为True 否则,0如果其为 False


最小的工作答案


import numpy as np


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]]])


mask = ((arr>1.5) & (arr<2.4))

arr = np.where(mask, 1, 0)

print (arr)

输出


array([[[0, 1, 0],

        [0, 1, 0]],


       [[0, 1, 1],

        [0, 1, 1]],


       [[1, 1, 0],

        [1, 1, 0]]])


查看完整回答
反对 回复 2021-11-16
  • 2 回答
  • 0 关注
  • 265 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信