对于第一个案例:
In [23]: a = [1,5,6]
In [24]: b = np.zeros(10, dtype=bool)
In [25]: b[a] = True
In [26]: b
Out[26]: array([False, True, False, False, False, True, True, False, False, False], dtype=bool)
一个同样简单,可能同样快速的列表版本:
In [27]: [True if i in a else False for i in range(10)]
Out[27]: [False, True, False, False, False, True, True, False, False, False]
对于列表的列表,只需要嵌套那个列表推导式:
In [34]: [[True if i in a1 else False for i in range(5)] for a1 in a]
Out[34]: [[False, True, False, True, False], [False, False, True, False, True]]
这种情况下的数组版本如下所示:
In [41]: a = [[1,3],[4,2]]
In [42]: b = np.zeros((len(a),5), bool)
In [43]: b[[[0],[1]],a]
Out[43]:
array([[False, False],
[False, False]], dtype=bool)
In [44]: b[[[0],[1]],a]=True
In [45]: b
Out[45]:
array([[False, True, False, True, False],
[False, False, True, False, True]], dtype=bool)
然而,这只对a
的子列表长度相同的情况有效。如果它们不同,我认为我们将不得不使用该列表的扁平版本。实际上,将2D情况转换为原始的1D情况。
对于不规则的a
,列表版本仍然很容易:
In [49]: a = [[1,2,3],[4,2],[1]]
In [50]: [[True if i in a1 else False for i in range(5)] for a1 in a]
Out[50]:
[[False, True, True, True, False],
[False, False, True, False, True],
[False, True, False, False, False]]
但是数组版本会更复杂一些:
构造两个索引数组,一个用于行,一个用于列:
In [53]: a0 = np.repeat(np.arange(3),[len(i) for i in a])
In [54]: a0
Out[54]: array([0, 0, 0, 1, 1, 2])
In [55]: a1 = np.hstack(a)
In [56]: a1
Out[56]: array([1, 2, 3, 4, 2, 1])
获取等效的展平(1d)索引:
In [57]: np.ravel_multi_index((a0,a1),(3,5))
Out[57]: array([ 1, 2, 3, 9, 7, 11], dtype=int32)
通过flat
将其应用于二维数组:
In [58]: b = np.zeros((3,5),bool)
In [59]: b.flat[Out[57]] = True
In [60]: b
Out[60]:
array([[False, True, True, True, False],
[False, False, True, False, True],
[False, True, False, False, False]], dtype=bool)
total_array_length
是什么,以及为什么在任何一个示例中b
的形状都与a
的形状不匹配。此外,关于您的8d数组的最后一个轴,您试图表达什么并不清楚。它听起来与您的示例不相似。 - Imran