繁体   English   中英

如何正确索引python中的大矩阵

[英]How to properly index a big matrix in 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.52.4 我想补相同的形状的另一矩阵arr1在其中的价值指数arr落入该范围内,以其他方式与0 也就是说,我想得到一个矩阵,如:

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

有没有简单的numpy技巧来做到这一点? 我知道使用for loop来做这件事很简单,但由于我的arr非常大,我希望它的速度相当快。 谢谢

您可以使用masking和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]]])

创建符合条件的布尔掩码。 将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]]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM