【发布时间】:2014-10-20 10:16:41
【问题描述】:
我想根据逻辑比较将一个 numpy 数组拆分为三个不同的数组。我要拆分的 numpy 数组称为x。它的形状如下所示,但它的条目有所不同:(为了回应 Saullo Castro 的评论,我包含了一个稍微不同的数组 x。)
array([[ 0.46006547, 0.5580928 , 0.70164242, 0.84519205, 1.4 ],
[ 0.00912908, 0.00912908, 0.05 , 0.05 , 0.05 ]])
此数组的值沿列单调递增。我还有另外两个名为lowest_gridpoints 和highest_gridpoints 的数组。这些数组的条目也有所不同,但形状始终与以下内容相同:
array([ 0.633, 0.01 ]), array([ 1.325, 0.99 ])
我要申请的选拔程序如下:
- 应从
x中删除所有值低于lowest_gridpoints中任何值的列,并构成数组temp1。 - 所有值高于
highest_gridpoints中任何值的列都应从x中删除,并构成数组temp2。 -
x中不包含在temp1或temp2中的所有列构成数组x_new。
我编写的以下代码实现了该任务。
if np.any( x[:,-1] > highest_gridpoints ) or np.any( x[:,0] < lowest_gridpoints ):
for idx, sample, in enumerate(x.T):
if np.any( sample > highest_gridpoints):
max_idx = idx
break
elif np.any( sample < lowest_gridpoints ):
min_idx = idx
temp1, temp2 = np.array([[],[]]), np.array([[],[]])
if 'min_idx' in locals():
temp1 = x[:,0:min_idx+1]
if 'max_idx' in locals():
temp2 = x[:,max_idx:]
if 'min_idx' in locals() or 'max_idx' in locals():
if 'min_idx' not in locals():
min_idx = -1
if 'max_idx' not in locals():
max_idx = x.shape[1]
x_new = x[:,min_idx+1:max_idx]
但是,由于大量使用循环,我怀疑这段代码效率很低。另外,我认为语法很臃肿。
是否有人对更有效地完成上述任务或看起来简洁的代码有想法?
【问题讨论】:
-
你的例子为我返回了
[]...如果有一个不同的输入可以用于比较就好了... -
@SaulloCastro:感谢您的评论。我稍微修改了数组 x。你知道如何修改我的代码吗?
-
您是否希望 temp1 和 temp2 互斥,或者列的值是否会低于
lowest_gridpoints中的值而另一个值高于highest_gridpoints中的值?另外,您的意思是沿行单调递增吗? -
也许你可以使用
np.argsort(x[i] + [lowest_gridpoints[i]])[-1]。这将为您提供大于lowest_gridpoints[i]的第一个元素的索引。对所有i执行此操作并获得最大值(highest_gridpoints的最小值) -
@greschd:这很好。我希望
temp1和temp2是互斥的。在我的代码中,这是由break命令在` if np.any(sample >highest_gridpoints): In doubt, I classify columns ofx` 到para2而不是para1之后保证的。我的意思是沿 np.arrays 的第二维单调递增,因此x[0,i] >= x[0,j]for i > j。我希望(并认为)这指的是列。