如何在np.where中加入索引?
How to join the indexing in np.where?
import numpy as np
a = np.array([1,2,3,4,5,6,7,8,9,10])
ind1 = np.where(a>8)
ind2 = np.where(a<3)
我要的是[1,2,9,10].
此时,如何加入两个索引,'ind1'和'ind2'?
当我遇到这样的情况时,我只是写了如下代码,
ind3 = np.where( (a>8) & (a<3) )
但是如果我面对更复杂的情况,我就不能使用上面的代码了。
所以我想知道如何找到直接连接'ind1'和'ind2'的索引,而不是在'np.where()'.
内部固定
=================================
对不起,我弄错了,但是已经有很好的答案了,所以我不会删除我原来的问题。
下面是我的意思,
import numpy as np
a = np.array([1,2,3,4,5,6,7,8,9,10])
ind1 = np.where(a>8)
ind2 = np.where(a>3)
我要期待的是[9,10]。
即我想交叉路口。
为什么不做一个 for 循环?
idx = []
for i in range X:
idx.append(np.where(some condition))
results = np.concat(idx)
您可以使用布尔掩码数组来实现:
ind1 = a > 8
ind2 = a < 3
ind3 = np.logical_or(ind1, ind2)
print(a[ind3]) # --> [ 1 2 9 10]
如果你有两个以上的条件:
ind_n = np.logical_or.reduce((ind1, ind2, ind3, ...))
要使用 np.where
,您必须将建议的代码更改为:
ind3 = np.where((a > 8) | (a < 3))
In [41]: a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
...: ind1 = np.where(a > 8)
...: ind2 = np.where(a > 3)
...:
首先,确保您了解每个 where/nonzero
产生的内容:
In [42]: ind1, ind2
Out[42]: ((array([8, 9]),), (array([3, 4, 5, 6, 7, 8, 9]),))
这是一个只有一个数组的元组(因为 a
是 1d)。
我们可以提取该数组:
In [43]: ind1[0], ind2[0]
Out[43]: (array([8, 9]), array([3, 4, 5, 6, 7, 8, 9]))
numpy
集合操作不是很好。但是我们可以使用Python组:
In [45]: set(ind1[0]), set(ind2[0])
Out[45]: ({8, 9}, {3, 4, 5, 6, 7, 8, 9})
In [46]: set(ind1[0]).intersection(set(ind2[0]))
Out[46]: {8, 9}
对 where 的布尔输入进行逻辑运算通常是更好的选择。
我们可以测试 2 个数组是否相等:
In [50]: ind1[0][:, None] == ind2[0]
Out[50]:
array([[False, False, False, False, False, True, False],
[False, False, False, False, False, False, True]])
In [52]: (ind1[0][:, None] == ind2[0]).any(axis=0)
Out[52]: array([False, False, False, False, False, True, True])
In [53]: ind2[0][(ind1[0][:, None] == ind2[0]).any(axis=0)]
Out[53]: array([8, 9])
import numpy as np
a = np.array([1,2,3,4,5,6,7,8,9,10])
ind1 = np.where(a>8)
ind2 = np.where(a<3)
我要的是[1,2,9,10].
此时,如何加入两个索引,'ind1'和'ind2'?
当我遇到这样的情况时,我只是写了如下代码,
ind3 = np.where( (a>8) & (a<3) )
但是如果我面对更复杂的情况,我就不能使用上面的代码了。
所以我想知道如何找到直接连接'ind1'和'ind2'的索引,而不是在'np.where()'.
内部固定=================================
对不起,我弄错了,但是已经有很好的答案了,所以我不会删除我原来的问题。
下面是我的意思,
import numpy as np
a = np.array([1,2,3,4,5,6,7,8,9,10])
ind1 = np.where(a>8)
ind2 = np.where(a>3)
我要期待的是[9,10]。 即我想交叉路口。
为什么不做一个 for 循环?
idx = []
for i in range X:
idx.append(np.where(some condition))
results = np.concat(idx)
您可以使用布尔掩码数组来实现:
ind1 = a > 8
ind2 = a < 3
ind3 = np.logical_or(ind1, ind2)
print(a[ind3]) # --> [ 1 2 9 10]
如果你有两个以上的条件:
ind_n = np.logical_or.reduce((ind1, ind2, ind3, ...))
要使用 np.where
,您必须将建议的代码更改为:
ind3 = np.where((a > 8) | (a < 3))
In [41]: a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
...: ind1 = np.where(a > 8)
...: ind2 = np.where(a > 3)
...:
首先,确保您了解每个 where/nonzero
产生的内容:
In [42]: ind1, ind2
Out[42]: ((array([8, 9]),), (array([3, 4, 5, 6, 7, 8, 9]),))
这是一个只有一个数组的元组(因为 a
是 1d)。
我们可以提取该数组:
In [43]: ind1[0], ind2[0]
Out[43]: (array([8, 9]), array([3, 4, 5, 6, 7, 8, 9]))
numpy
集合操作不是很好。但是我们可以使用Python组:
In [45]: set(ind1[0]), set(ind2[0])
Out[45]: ({8, 9}, {3, 4, 5, 6, 7, 8, 9})
In [46]: set(ind1[0]).intersection(set(ind2[0]))
Out[46]: {8, 9}
对 where 的布尔输入进行逻辑运算通常是更好的选择。
我们可以测试 2 个数组是否相等:
In [50]: ind1[0][:, None] == ind2[0]
Out[50]:
array([[False, False, False, False, False, True, False],
[False, False, False, False, False, False, True]])
In [52]: (ind1[0][:, None] == ind2[0]).any(axis=0)
Out[52]: array([False, False, False, False, False, True, True])
In [53]: ind2[0][(ind1[0][:, None] == ind2[0]).any(axis=0)]
Out[53]: array([8, 9])