我们说我有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阵列。
答案 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
不确定它是否会比稍微更加循环的代码更快,因为它同时执行cumsum
和diff
修改强>
您也可以这样做,这可能更快(利用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