繁体   English   中英

2d数组的numpy掩码,其中1d数组中的所有值

[英]numpy mask for 2d array with all values in 1d array

我想基于1d矩阵中的日期将日期的2d矩阵转换为布尔型矩阵。

[[20030102, 20030102, 20070102],
 [20040102, 20040102, 20040102].,
 [20050102, 20050102, 20050102]] 

应该成为

[[True, True, False],
 [False, False, False].,
 [True, True, True]] 

如果我提供一维数组[20010203,20030102,20030501,20050102,20060101]

import numpy as np

dateValues = np.array(
    [[20030102, 20030102, 20030102],
     [20040102, 20040102, 20040102],
     [20050102, 20050102, 20050102]])

requestedDates = [20010203, 20030102, 20030501, 20050102, 20060101]

ix = np.in1d(dateValues.ravel(), requestedDates).reshape(dateValues.shape)

print(ix)

返回:

[[ True  True  True]
 [False False False]
 [ True  True  True]]

有关更多信息(文档),请参考numpy.in1dhttp : numpy.in1d

a = np.array([[20030102, 20030102, 20070102],
              [20040102, 20040102, 20040102],
              [20050102, 20050102, 20050102]])

b = np.array([20010203, 20030102, 20030501, 20050102, 20060101])

>>> a.shape
(3, 3)
>>> b.shape
(5,)
>>>

为了进行比较,您需要通过向a添加轴来将b 广播a -将a的每个元素与b每个元素进行比较

>>> mask = a[...,None] == b
>>> mask.shape
(3, 3, 5)
>>> 

然后使用np.any()查看是否有任何匹配项

>>> np.any(mask, axis = 2, keepdims = False)
array([[ True,  True, False],
       [False, False, False],
       [ True,  True,  True]], dtype=bool)

timeit.Timer与in1d比较:

>>> 
>>> t = Timer("np.any(a[...,None] == b, axis = 2)","from __main__ import np, a, b")
>>> t.timeit(10000)
0.13268041338812964
>>> t = Timer("np.in1d(a.ravel(), b).reshape(a.shape)","from __main__ import np, a, b")
>>> t.timeit(10000)
0.26060646913566643
>>>

暂无
暂无

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

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