numpy逻辑中的第一次出现

时间:2017-03-30 05:00:14

标签: python numpy

我们说我有numpy.ndarray

a = np.array([0,4,10,0,11,10])

我将其与10进行了比较。

a >= 10
# array([False, False,  True, False,  True,  True], dtype=bool)

我希望单个True ,即仅在第一次出现时为True。

我想将此应用于n-D numpy.ndarray中的给定轴。(例如,1000 * 1000 * 10)

a_2d = np.array([[0,4,10],[0,11,10]])
#if axis == 1: array([[False, False, True], [False, True, False]])

我做了什么:

对于一维数组,我设法使用this

b=np.zeros(a.size)
b[np.argmax(a>=10)]=True
#b=array([ 0.,  0.,  1.,  0.,  0.,  0.])

但是,我不知道如何将其应用于大型 n-D阵列

3 个答案:

答案 0 :(得分:1)

对于1D或2D,这个应该没有for循环:

def firstByRow(a, f = lambda x: x >= 10):
    b = (np.cumsum(f(a), axis = -1) == 1).T
    b[1:] = b[1:] * np.equal(b[1:], np.diff((f(a)).astype(int), axis = -1).T)
    return b.T

不确定它是否会比稍微更加循环的代码更快,因为它同时执行cumsumdiff

修改

您也可以这样做,这可能更快(利用np.unique(return_index = True)选择第一次出现):

def firstByAxis(a, f = lambda x: x >= 10, axis = 0):
    c = np.where(f(a))
    i = np.unique(c[axis], return_index = True)[1]
    b = np.zeros_like(a)
    b[tuple(np.take(c, i, axis = -1))] = 1
    return b

答案 1 :(得分:1)

您可以尝试以下操作:

>>> import numpy as np
>>> a_2d = np.array([[0,4,10],[0,11,10]])
>>> r, c = np.where( a_2d >= 10 )
>>> mask = r+c == (r+c).min()
>>> highMask = np.zeros(np.shape(a_2d))
>>> highMask[r[mask], c[mask]] = 1
>>> highMask
    array([[ 0.,  0.,  1.],
           [ 0.,  1.,  0.]])

2D阵列中没有“第一个”的东西。在2D数组中,最小索引将在2D轴上形成一条线,两者都具有最小的索引值。对于3D矩阵,这将是一个表面等。

这样一行的例子是:

 0 0 0 0 0 1
 0 0 0 0 1 0
 0 0 0 1 0 0
 0 0 1 0 0 0
 0 1 0 0 0 0
 1 0 0 0 0 0

所有这些都与[0,0]位置等距......

答案 2 :(得分:0)

如果enumerate超过argmax,则可以更新zeros数组。

<强>代码:

a = np.array([[0, 4, 10], [0, 11, 10]])
print(a)

b = np.zeros(a.shape)
for i, j in enumerate(np.argmax(a >= 10, axis=1)):
    b[i, j] = 1
print(b)

<强>结果:

[[ 0  4 10]
 [ 0 11 10]]

[[ 0.  0.  1.]
 [ 0.  1.  0.]]

使用高级索引:

c = np.zeros(a.shape)
c[list(range(a.shape[0])), np.argmax(a >= 10, axis=1)] = 1