【发布时间】:2020-04-27 16:54:55
【问题描述】:
我有一个形状为 [N,M,2] 的数组。我对最后一个索引有一个条件,即
condition = matrix[:,:,0]**2 + matrix[:,:,1]**2 <1
现在,我想选择满足这个条件的矩阵元素。如果我一味地申请matrix[condition],我显然会得到一个形状为[something, 2]的结果,否则它就不是矩阵了。
我的问题是 我需要保持形状 [N, ..., 2]。例如,只取满足条件的前 K 个元素就可以了(假设总是至少有 K 个)。我该怎么做?
我会写一个 for 循环
matrix_new = np.zeros([N,K,2])
for i in range(N):
condition = matrix[i,:,0]**2 + matrix[i,:,1]**2 <1
matrix_new[i] = matrix[condition][:K]
但这会很慢。如何避免 for 循环?
【问题讨论】:
-
尝试向量化您的代码。看这个例子stackoverflow.com/questions/47369976/…
-
你问的不清楚。您不能简单地为满足条件的元素设置形状 [N, ..., 2],因为每行中可能有不同数量的元素满足条件,因此输出不会是矩形,因此 numpy 无法创建数组出它。您的意思是让不满足条件的元素保留一个默认值,比如 0?
-
@Ehsan 我现在明白你的意思了。是的,我假设 OP 希望将失败替换为零,否则 OP 只需要 matrix[cond] 本身。
-
不,我不想用零替换。我想排除不满意的项目。为了得到一个矩阵,我想取满足条件的“前K”个元素(假设总是至少有K)
-
@AmitGupta 但这就是问题所在,我该如何对其进行矢量化?